summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2018-06-23 16:54:03 +0000
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2018-06-23 16:54:03 +0000
commit6c4eac569e9b6b332e192e7f37a778e77494496b (patch)
treedb820eec9a645fccdcd2ddfbdecdb9e82a31edfc
parent21df83a28d323768ddd9659a47509f04b64ce7fa (diff)
parentf75559023250c5beabaa49e51cd7b49cadfc5559 (diff)
downloadgnutls-6c4eac569e9b6b332e192e7f37a778e77494496b.tar.gz
Merge branch 'gost-no-tls' into 'master'
GOST certificates/PKCS#7/PKCS#12 support See merge request gnutls/gnutls!654
-rw-r--r--.gitlab-ci.yml1
-rw-r--r--configure.ac1
-rw-r--r--doc/Makefile.am25
-rwxr-xr-xdoc/credentials/gnutls-http-serv1
-rw-r--r--doc/credentials/x509/Makefile.am3
-rw-r--r--doc/credentials/x509/cert-gost01.pem18
-rw-r--r--doc/credentials/x509/cert-gost12.pem19
-rw-r--r--doc/credentials/x509/clicert-gost01.pem17
-rw-r--r--doc/credentials/x509/clicert-gost12.pem19
-rw-r--r--doc/credentials/x509/clikey-gost01.pem42
-rw-r--r--doc/credentials/x509/clikey-gost12.pem49
-rw-r--r--doc/credentials/x509/key-gost01.pem42
-rw-r--r--doc/credentials/x509/key-gost12.pem49
-rw-r--r--doc/manpages/Makefile.am12
-rw-r--r--lib/algorithms.h5
-rw-r--r--lib/algorithms/ciphers.c35
-rw-r--r--lib/algorithms/ecc.c76
-rw-r--r--lib/algorithms/mac.c24
-rw-r--r--lib/algorithms/publickey.c6
-rw-r--r--lib/algorithms/secparams.c4
-rw-r--r--lib/algorithms/sign.c26
-rw-r--r--lib/cert-cred.c12
-rw-r--r--lib/crypto-backend.h17
-rw-r--r--lib/gnutls.asn10
-rw-r--r--lib/gnutls_asn1_tab.c8
-rw-r--r--lib/includes/gnutls/abstract.h34
-rw-r--r--lib/includes/gnutls/crypto.h3
-rw-r--r--lib/includes/gnutls/gnutls.h.in85
-rw-r--r--lib/includes/gnutls/x509.h36
-rw-r--r--lib/libgnutls.map12
-rw-r--r--lib/mpi.c107
-rw-r--r--lib/mpi.h5
-rw-r--r--lib/nettle/Makefile.am25
-rw-r--r--lib/nettle/cipher.c127
-rw-r--r--lib/nettle/gost/bignum-le.c78
-rw-r--r--lib/nettle/gost/bignum-le.h71
-rw-r--r--lib/nettle/gost/ecc-gost-curve.h61
-rw-r--r--lib/nettle/gost/ecc-gost-hash.c66
-rw-r--r--lib/nettle/gost/ecc-gost256cpa-32.h1071
-rw-r--r--lib/nettle/gost/ecc-gost256cpa-64.h1071
-rw-r--r--lib/nettle/gost/ecc-gost256cpa.c132
-rw-r--r--lib/nettle/gost/ecc-gost512a-32.h1081
-rw-r--r--lib/nettle/gost/ecc-gost512a-64.h559
-rw-r--r--lib/nettle/gost/ecc-gost512a.c132
-rw-r--r--lib/nettle/gost/ecc-gostdsa-sign.c104
-rw-r--r--lib/nettle/gost/ecc-gostdsa-verify.c133
-rw-r--r--lib/nettle/gost/ecc-internal.h253
-rw-r--r--lib/nettle/gost/gmp-glue.h76
-rw-r--r--lib/nettle/gost/gost28147.c2367
-rw-r--r--lib/nettle/gost/gost28147.h118
-rw-r--r--lib/nettle/gost/gostdsa-sign.c77
-rw-r--r--lib/nettle/gost/gostdsa-verify.c81
-rw-r--r--lib/nettle/gost/gostdsa.h102
-rw-r--r--lib/nettle/gost/gosthash94-meta.c43
-rw-r--r--lib/nettle/gost/gosthash94.c374
-rw-r--r--lib/nettle/gost/gosthash94.h95
-rw-r--r--lib/nettle/gost/hmac-gost.h103
-rw-r--r--lib/nettle/gost/hmac-gosthash94.c62
-rw-r--r--lib/nettle/gost/hmac-streebog.c76
-rw-r--r--lib/nettle/gost/nettle-internal.h52
-rw-r--r--lib/nettle/gost/nettle-write.h58
-rw-r--r--lib/nettle/gost/pbkdf2-gost.h72
-rw-r--r--lib/nettle/gost/pbkdf2-hmac-gosthash94.c56
-rw-r--r--lib/nettle/gost/pbkdf2-hmac-streebog.c69
-rw-r--r--lib/nettle/gost/streebog-meta.c46
-rw-r--r--lib/nettle/gost/streebog.c1333
-rw-r--r--lib/nettle/gost/streebog.h105
-rw-r--r--lib/nettle/mac.c71
-rw-r--r--lib/nettle/mpi.c20
-rw-r--r--lib/nettle/pk.c380
-rw-r--r--lib/pk.c233
-rw-r--r--lib/pk.h20
-rw-r--r--lib/pkix.asn6
-rw-r--r--lib/pkix_asn1_tab.c3
-rw-r--r--lib/privkey.c16
-rw-r--r--lib/privkey_raw.c102
-rw-r--r--lib/pubkey.c169
-rw-r--r--lib/x509/common.c95
-rw-r--r--lib/x509/common.h11
-rw-r--r--lib/x509/key_decode.c150
-rw-r--r--lib/x509/key_encode.c215
-rw-r--r--lib/x509/output.c63
-rw-r--r--lib/x509/pkcs12.c128
-rw-r--r--lib/x509/pkcs12_encr.c5
-rw-r--r--lib/x509/pkcs7-crypt.c274
-rw-r--r--lib/x509/pkcs7_int.h6
-rw-r--r--lib/x509/privkey.c147
-rw-r--r--lib/x509/privkey_pkcs8.c185
-rw-r--r--lib/x509/x509.c53
-rw-r--r--lib/x509/x509_int.h14
-rw-r--r--m4/hooks.m414
-rw-r--r--src/certtool-cfg.c5
-rw-r--r--src/certtool-common.c97
-rw-r--r--src/certtool-common.h9
-rw-r--r--src/certtool.c24
-rw-r--r--symbols.last12
-rw-r--r--tests/Makefile.am3
-rw-r--r--tests/cert-common.h216
-rw-r--r--tests/cert-tests/Makefile.am19
-rw-r--r--tests/cert-tests/data/gost-cert-nogost.pem45
-rw-r--r--tests/cert-tests/data/gost-cert.pem20
-rw-r--r--tests/cert-tests/data/gost01.p12bin0 -> 1047 bytes
-rw-r--r--tests/cert-tests/data/gost12-2.p12bin0 -> 1454 bytes
-rw-r--r--tests/cert-tests/data/gost12.p12bin0 -> 1454 bytes
-rw-r--r--tests/cert-tests/data/gost94-cert.pem33
-rw-r--r--tests/cert-tests/data/rfc4490.p7bbin0 -> 300 bytes
-rw-r--r--tests/cert-tests/data/rfc4490.p7b.out14
-rwxr-xr-xtests/cert-tests/gost103
-rwxr-xr-xtests/cert-tests/pem-decoding27
-rwxr-xr-xtests/cert-tests/pkcs12-gost86
-rwxr-xr-xtests/cert-tests/pkcs730
-rw-r--r--tests/chainverify.c6
-rw-r--r--tests/key-import-export.c172
-rw-r--r--tests/oids.c24
-rw-r--r--tests/pkcs11/pkcs11-chainverify.c6
-rw-r--r--tests/privkey-keygen.c13
-rw-r--r--tests/test-chains.h78
-rw-r--r--tests/x509sign-verify-common.h39
-rw-r--r--tests/x509sign-verify-gost.c65
119 files changed, 14557 insertions, 101 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index dd61e5199c..be6e4e428e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -101,6 +101,7 @@ minimal.Fedora.x86_64:
--disable-nls --disable-libdane --without-p11-kit --without-tpm
--disable-ssl3-support --disable-ssl2-support --disable-doc --enable-openssl-compatibility
--disable-gcc-warnings
+ --disable-gost
- make -j$(nproc)
tags:
- shared
diff --git a/configure.ac b/configure.ac
index 5d78f3f7e2..c01a5c259e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1042,6 +1042,7 @@ if features are disabled)
PSK support: $ac_enable_psk
DHE support: $ac_enable_dhe
ECDHE support: $ac_enable_ecdhe
+ GOST support: $ac_enable_gost
Anon auth support: $ac_enable_anon
Heartbeat support: $ac_enable_heartbeat
IDNA support: $idna_support
diff --git a/doc/Makefile.am b/doc/Makefile.am
index e35e92ffd0..ed6ee8371c 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -552,6 +552,7 @@ ENUMS += enums/gnutls_ecc_curve_t
ENUMS += enums/gnutls_ext_flags_t
ENUMS += enums/gnutls_ext_parse_type_t
ENUMS += enums/gnutls_fips_mode_t
+ENUMS += enums/gnutls_gost_paramset_t
ENUMS += enums/gnutls_group_t
ENUMS += enums/gnutls_handshake_description_t
ENUMS += enums/gnutls_init_flags_t
@@ -893,6 +894,8 @@ FUNCS += functions/gnutls_db_set_store_function
FUNCS += functions/gnutls_db_set_store_function.short
FUNCS += functions/gnutls_decode_ber_digest_info
FUNCS += functions/gnutls_decode_ber_digest_info.short
+FUNCS += functions/gnutls_decode_gost_rs_value
+FUNCS += functions/gnutls_decode_gost_rs_value.short
FUNCS += functions/gnutls_decode_rs_value
FUNCS += functions/gnutls_decode_rs_value.short
FUNCS += functions/gnutls_deinit
@@ -973,6 +976,8 @@ FUNCS += functions/gnutls_ecc_curve_list
FUNCS += functions/gnutls_ecc_curve_list.short
FUNCS += functions/gnutls_encode_ber_digest_info
FUNCS += functions/gnutls_encode_ber_digest_info.short
+FUNCS += functions/gnutls_encode_gost_rs_value
+FUNCS += functions/gnutls_encode_gost_rs_value.short
FUNCS += functions/gnutls_encode_rs_value
FUNCS += functions/gnutls_encode_rs_value.short
FUNCS += functions/gnutls_error_is_fatal
@@ -1015,6 +1020,10 @@ FUNCS += functions/gnutls_global_set_mutex
FUNCS += functions/gnutls_global_set_mutex.short
FUNCS += functions/gnutls_global_set_time_function
FUNCS += functions/gnutls_global_set_time_function.short
+FUNCS += functions/gnutls_gost_paramset_get_name
+FUNCS += functions/gnutls_gost_paramset_get_name.short
+FUNCS += functions/gnutls_gost_paramset_get_oid
+FUNCS += functions/gnutls_gost_paramset_get_oid.short
FUNCS += functions/gnutls_group_get
FUNCS += functions/gnutls_group_get.short
FUNCS += functions/gnutls_group_get_id
@@ -1213,6 +1222,8 @@ FUNCS += functions/gnutls_oid_to_digest
FUNCS += functions/gnutls_oid_to_digest.short
FUNCS += functions/gnutls_oid_to_ecc_curve
FUNCS += functions/gnutls_oid_to_ecc_curve.short
+FUNCS += functions/gnutls_oid_to_gost_paramset
+FUNCS += functions/gnutls_oid_to_gost_paramset.short
FUNCS += functions/gnutls_oid_to_mac
FUNCS += functions/gnutls_oid_to_mac.short
FUNCS += functions/gnutls_oid_to_pk
@@ -1557,6 +1568,8 @@ FUNCS += functions/gnutls_privkey_export_ecc_raw
FUNCS += functions/gnutls_privkey_export_ecc_raw.short
FUNCS += functions/gnutls_privkey_export_ecc_raw2
FUNCS += functions/gnutls_privkey_export_ecc_raw2.short
+FUNCS += functions/gnutls_privkey_export_gost_raw2
+FUNCS += functions/gnutls_privkey_export_gost_raw2.short
FUNCS += functions/gnutls_privkey_export_openpgp
FUNCS += functions/gnutls_privkey_export_openpgp.short
FUNCS += functions/gnutls_privkey_export_pkcs11
@@ -1591,6 +1604,8 @@ FUNCS += functions/gnutls_privkey_import_ext3
FUNCS += functions/gnutls_privkey_import_ext3.short
FUNCS += functions/gnutls_privkey_import_ext4
FUNCS += functions/gnutls_privkey_import_ext4.short
+FUNCS += functions/gnutls_privkey_import_gost_raw
+FUNCS += functions/gnutls_privkey_import_gost_raw.short
FUNCS += functions/gnutls_privkey_import_openpgp
FUNCS += functions/gnutls_privkey_import_openpgp.short
FUNCS += functions/gnutls_privkey_import_openpgp_raw
@@ -1689,6 +1704,8 @@ FUNCS += functions/gnutls_pubkey_export_ecc_raw2
FUNCS += functions/gnutls_pubkey_export_ecc_raw2.short
FUNCS += functions/gnutls_pubkey_export_ecc_x962
FUNCS += functions/gnutls_pubkey_export_ecc_x962.short
+FUNCS += functions/gnutls_pubkey_export_gost_raw2
+FUNCS += functions/gnutls_pubkey_export_gost_raw2.short
FUNCS += functions/gnutls_pubkey_export_rsa_raw
FUNCS += functions/gnutls_pubkey_export_rsa_raw.short
FUNCS += functions/gnutls_pubkey_export_rsa_raw2
@@ -1713,6 +1730,8 @@ FUNCS += functions/gnutls_pubkey_import_ecc_raw
FUNCS += functions/gnutls_pubkey_import_ecc_raw.short
FUNCS += functions/gnutls_pubkey_import_ecc_x962
FUNCS += functions/gnutls_pubkey_import_ecc_x962.short
+FUNCS += functions/gnutls_pubkey_import_gost_raw
+FUNCS += functions/gnutls_pubkey_import_gost_raw.short
FUNCS += functions/gnutls_pubkey_import_openpgp
FUNCS += functions/gnutls_pubkey_import_openpgp.short
FUNCS += functions/gnutls_pubkey_import_openpgp_raw
@@ -2375,6 +2394,8 @@ FUNCS += functions/gnutls_x509_crt_get_pk_dsa_raw
FUNCS += functions/gnutls_x509_crt_get_pk_dsa_raw.short
FUNCS += functions/gnutls_x509_crt_get_pk_ecc_raw
FUNCS += functions/gnutls_x509_crt_get_pk_ecc_raw.short
+FUNCS += functions/gnutls_x509_crt_get_pk_gost_raw
+FUNCS += functions/gnutls_x509_crt_get_pk_gost_raw.short
FUNCS += functions/gnutls_x509_crt_get_pk_oid
FUNCS += functions/gnutls_x509_crt_get_pk_oid.short
FUNCS += functions/gnutls_x509_crt_get_pk_rsa_raw
@@ -2659,6 +2680,8 @@ FUNCS += functions/gnutls_x509_privkey_export_dsa_raw
FUNCS += functions/gnutls_x509_privkey_export_dsa_raw.short
FUNCS += functions/gnutls_x509_privkey_export_ecc_raw
FUNCS += functions/gnutls_x509_privkey_export_ecc_raw.short
+FUNCS += functions/gnutls_x509_privkey_export_gost_raw
+FUNCS += functions/gnutls_x509_privkey_export_gost_raw.short
FUNCS += functions/gnutls_x509_privkey_export_pkcs8
FUNCS += functions/gnutls_x509_privkey_export_pkcs8.short
FUNCS += functions/gnutls_x509_privkey_export_rsa_raw
@@ -2689,6 +2712,8 @@ FUNCS += functions/gnutls_x509_privkey_import_dsa_raw
FUNCS += functions/gnutls_x509_privkey_import_dsa_raw.short
FUNCS += functions/gnutls_x509_privkey_import_ecc_raw
FUNCS += functions/gnutls_x509_privkey_import_ecc_raw.short
+FUNCS += functions/gnutls_x509_privkey_import_gost_raw
+FUNCS += functions/gnutls_x509_privkey_import_gost_raw.short
FUNCS += functions/gnutls_x509_privkey_import_openssl
FUNCS += functions/gnutls_x509_privkey_import_openssl.short
FUNCS += functions/gnutls_x509_privkey_import_pkcs8
diff --git a/doc/credentials/gnutls-http-serv b/doc/credentials/gnutls-http-serv
index a0af8afbae..51b1bc5389 100755
--- a/doc/credentials/gnutls-http-serv
+++ b/doc/credentials/gnutls-http-serv
@@ -4,6 +4,7 @@
--x509certfile x509/cert-dsa.pem --x509keyfile x509/key-dsa.pem \
--x509certfile x509/cert-ecc.pem --x509keyfile x509/key-ecc.pem \
--x509certfile x509/cert-rsa-pss.pem --x509keyfile x509/key-rsa-pss.pem \
+ --x509certfile x509/cert-gost01.pem --x509keyfile x509/key-gost01.pem \
--srppasswd srp/tpasswd --srppasswdconf srp/tpasswd.conf \
--pskpasswd psk-passwd.txt \
$*
diff --git a/doc/credentials/x509/Makefile.am b/doc/credentials/x509/Makefile.am
index 426af74aa1..c12f80a242 100644
--- a/doc/credentials/x509/Makefile.am
+++ b/doc/credentials/x509/Makefile.am
@@ -1,4 +1,5 @@
EXTRA_DIST = ca-key.pem ca.pem cert-rsa.pem key-rsa.pem clikey.pem clicert.pem \
clicert-dsa.pem clikey-dsa.pem cert-dsa.pem key-dsa.pem cert-ecc.pem key-ecc.pem \
cert-ecc-sign.pem key-rsa-pss.pem cert-rsa-pss.pem example.com-cert.pem \
- example.com-key.pem
+ example.com-key.pem \
+ key-gost01.pem cert-gost01.pem key-gost12.pem cert-gost12.pem
diff --git a/doc/credentials/x509/cert-gost01.pem b/doc/credentials/x509/cert-gost01.pem
new file mode 100644
index 0000000000..91ee92c1d1
--- /dev/null
+++ b/doc/credentials/x509/cert-gost01.pem
@@ -0,0 +1,18 @@
+-----BEGIN CERTIFICATE-----
+MIICzzCCAYegAwIBAgIIWDz9jhh1DgAwDQYJKoZIhvcNAQELBQAwGTEXMBUGA1UE
+AxMOR251VExTIFRlc3QgQ0EwIBcNMTYxMTI5MDQwMTE5WhgPOTk5OTEyMzEyMzU5
+NTlaMDUxMzAxBgNVBAMTKkdudVRMUyBUZXN0IHNlcnZlciAoR09TVCAyMDAxIGNl
+cnRpZmljYXRlKTBjMBwGBiqFAwICEzASBgcqhQMCAiMBBgcqhQMCAh4BA0MABEC5
+V8s59a1LRKeQBv3Zknci/H581sZjfQavcTxe/rzVVDo0NtL6RjtY4fv0FcReVrap
+HyrcsEoVgRlYtb2oP7ruo4GNMIGKMAwGA1UdEwEB/wQCMAAwFAYDVR0RBA0wC4IJ
+bG9jYWxob3N0MBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdDwEB/wQFAwMHgAAw
+HQYDVR0OBBYEFPdNK/tTqJobyllIdBOSU0aVsZa4MB8GA1UdIwQYMBaAFE1Wt2oA
+WPFnkvSmdVUbjlMBA+/PMA0GCSqGSIb3DQEBCwUAA4IBMQByEmQuG1vAVeEEPHxi
+04P2dz7Vaw77QOXsKT3sungZpacGqFFB1ZgpxT6W0yriIa55grhTWRXnrCEWBFGE
+eOQrg7qkgdwDEFdmjO5TBYhSrX8ykkq1trhSSTVBJkgweHsAVlbA+xhUMgu0FKyN
+ViraCsbUh3QZSBTSUrQJpGQgdeBMiBfsf7rAo7ICQSdYhyc9lW7FZVwvX1Xvrjxq
+W6G5XBdxAk7xPJxrpWzC/xkxK97ceCYSulGrgkYuFVWa66t3F0YtSYlQ1z0HqJh5
+yrkuxW1LS+f6gcxc/k1f/BZR1gxWMwME8kL3C9C1Ud+5wejKMVtT+/bPKZztoAPy
+ik4r7vEu1WQDnepN5D0dQqzH7a/Xvy7ELOAKg0icKsHaHBX6OinLOOZeQ0xMQpjo
+W411
+-----END CERTIFICATE-----
diff --git a/doc/credentials/x509/cert-gost12.pem b/doc/credentials/x509/cert-gost12.pem
new file mode 100644
index 0000000000..2b6f72ccac
--- /dev/null
+++ b/doc/credentials/x509/cert-gost12.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDFzCCAc+gAwIBAgIIWDz9WwicqOswDQYJKoZIhvcNAQELBQAwGTEXMBUGA1UE
+AxMOR251VExTIFRlc3QgQ0EwIBcNMTYxMTI5MDQwMDI5WhgPOTk5OTEyMzEyMzU5
+NTlaMDUxMzAxBgNVBAMTKkdudVRMUyBUZXN0IHNlcnZlciAoR09TVCAyMDEyIGNl
+cnRpZmljYXRlKTCBqjAhBggqhQMHAQEBAjAVBgkqhQMHAQIBAgEGCCqFAwcBAQID
+A4GEAASBgHrV5GYilkHQ75pNQH3H7XA0rFzLQU3cyiBXWa9GAajMmXCsEc96tLO8
+4inIoYd+pKXW5JFjpcKQP2RYWO8ozWiDcAipeNegdEFIj9YXGhlLkE9Ji5tLo3CQ
+E/qmAXcG3/A4fnTPe8ONMcr1mNauvy2ZMR4GHMwngQnclHjxkA+po4GNMIGKMAwG
+A1UdEwEB/wQCMAAwFAYDVR0RBA0wC4IJbG9jYWxob3N0MBMGA1UdJQQMMAoGCCsG
+AQUFBwMBMA8GA1UdDwEB/wQFAwMHgAAwHQYDVR0OBBYEFM3S8msevnnQj915hOMP
+qlzJUzk0MB8GA1UdIwQYMBaAFE1Wt2oAWPFnkvSmdVUbjlMBA+/PMA0GCSqGSIb3
+DQEBCwUAA4IBMQBJV6tIOi08WYSTY26y5C+YytuMwYiEcSYQX0qEnTLroetO92UB
+vlqvfR3LH/Dky7lal/gLdQ03Qiyam9uqOuPM+KUkveKdMEVus1pkqk7E450lXK27
+GEwbKtkGptwjdaVEmoUdha8Om9YsJpdccOaKVGf1XDrhVa0UPZmKDagLc8nkk8W4
+Gr5bE6QgxUfF7TUQIltM+5hhhRo2XWJJdANMSmcREj63rwTPcEyhqILms7a1LXlC
+s/GED7P0KQYnuhzwrYhZgaD0/FMMljpHyIYuo7r0ELwb8wQNTIt3YfliOW131/fD
+ZNgRZpxkTrEFw8TgOv78aSX60n6zeiRDGlQlFCmx1MHOEL/8jDDMEhKi1R47DZTX
+rpz7EIn/e9OqO+E/B9tIIsEjuctNT/ylYjrG
+-----END CERTIFICATE-----
diff --git a/doc/credentials/x509/clicert-gost01.pem b/doc/credentials/x509/clicert-gost01.pem
new file mode 100644
index 0000000000..e4e71da8b6
--- /dev/null
+++ b/doc/credentials/x509/clicert-gost01.pem
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE-----
+MIICtjCCAW6gAwIBAgIIWD63xQjfjMkwDQYJKoZIhvcNAQELBQAwGTEXMBUGA1UE
+AxMOR251VExTIFRlc3QgQ0EwIBcNMTYxMTMwMTEyODA1WhgPOTk5OTEyMzEyMzU5
+NTlaMBUxEzARBgNVBAMTCkNsaWVudCBubzQwYzAcBgYqhQMCAhMwEgYHKoUDAgIj
+AwYHKoUDAgIeAQNDAARA95oquYmvSqn9iwzP1y7Lx8j26qOKEj1qH1HHFLk5HF1j
+x4SWd4Wk7vNG0RWIEJNwraIm+YphAV1hs6ctAmw8RKOBlDCBkTAMBgNVHRMBAf8E
+AjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMBsGA1UdEQQUMBKBEHRlc3RAZXhhbXBs
+ZS5jb20wDwYDVR0PAQH/BAUDAweAADAdBgNVHQ4EFgQUssJK21ZcEfNQWXv1SJm2
+gUKbsuMwHwYDVR0jBBgwFoAUTVa3agBY8WeS9KZ1VRuOUwED788wDQYJKoZIhvcN
+AQELBQADggExABAZgUjjPf8TdBPS/PntDDB22+raSqjRi7KK3P4iQfkYBXStYdQ3
+cBm86MvbvrAc2jTSpvfVviUmR9hiaCjs1y/3HRXWX+6XL3j0TndmaPAeUTdVeJZx
+JBZRhiYYvd4ZsHQCfld7O4pGdDwZsqj5P2ku84BS9jA3/J9LIw7Ihe3ERxsz6V/V
+1KvEZt1ub2hU0hq8M1e2bdQCD5B9oCF42FTmZa01S1trGHSCWXcSsL02nkLZGqAK
+K49KXUfSho116/gift0nTr/smezZRY6dLBjxkHtB8WZakfQe61xwhOoItvdL60/l
+jeMy61Afs+lGvy3Uw48wkoFKT416IyVvN2BPvXUhArMZ59X5L6SAfQrL7WO4W+9x
+8Hb0XE45xDFSlLKdVbaV+mt/jE/+I+Q37Oc=
+-----END CERTIFICATE-----
diff --git a/doc/credentials/x509/clicert-gost12.pem b/doc/credentials/x509/clicert-gost12.pem
new file mode 100644
index 0000000000..dccf56b391
--- /dev/null
+++ b/doc/credentials/x509/clicert-gost12.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIC/jCCAbagAwIBAgIIWD64LTQbMXgwDQYJKoZIhvcNAQELBQAwGTEXMBUGA1UE
+AxMOR251VExTIFRlc3QgQ0EwIBcNMTYxMTMwMTEyOTUwWhgPOTk5OTEyMzEyMzU5
+NTlaMBUxEzARBgNVBAMTCkNsaWVudCBubzUwgaowIQYIKoUDBwEBAQIwFQYJKoUD
+BwECAQIBBggqhQMHAQECAwOBhAAEgYBGj2SbfK0JnE6JJecjqpG1nJmdWrABsboS
+YRNyxZjDzdQ7JswlwTewx9zmjbzpsnP/fVyZ3W+8IkTCPFizLQFkLLdrdWFuWpiB
+vPTE0wSfIif33qrMvR1kmsxtsWcptXvGungyWmReNRhRx5Gmcpnn3XDMfA3VbPS0
+N4fXupcBzKOBlDCBkTAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMC
+MBsGA1UdEQQUMBKBEHRlc3RAZXhhbXBsZS5jb20wDwYDVR0PAQH/BAUDAweAADAd
+BgNVHQ4EFgQUPu0uSQQTvQ9WLoWaJdwHw14Eh0swHwYDVR0jBBgwFoAUTVa3agBY
+8WeS9KZ1VRuOUwED788wDQYJKoZIhvcNAQELBQADggExABDT/c45PFXtR/VahEVj
+pqWKCGbng1X2Y5snn44fgE7kDVi8h32h19wndfg294+4fKiL0XVvXZtUc46CMCuM
+lvAT97YDN0Tf8Sg7PrDN1EEgE1M/rpN6kdAyvw9W8B5B66xb1K0PZIo4CnKVwn/T
+ogQRk4qucEvky3Bcg/v7ZsK1ix9OuYB2M2rzhLpvn8/JIT3+6TmYrTbNgRiXoT3x
+EV5V3uwg4kuh8XEDWd1vr9N2nyj1anM0m6D87HzYICCKpeXc/jij4i5c5XpxYeeC
+UtAqsA1BGopQSWFpuheHsbODEScRdJLByweDZ9PbL3oEuKnWLyIYvzAAp3kP5Hg2
+MVp4a0BwbOmsUe5ciwFGVetcJ8DvBZzkqU49YOY4eCtnLAXpsE1nyLqfG/fXEpEQ
+QS4=
+-----END CERTIFICATE-----
diff --git a/doc/credentials/x509/clikey-gost01.pem b/doc/credentials/x509/clikey-gost01.pem
new file mode 100644
index 0000000000..94bb51c461
--- /dev/null
+++ b/doc/credentials/x509/clikey-gost01.pem
@@ -0,0 +1,42 @@
+Public Key Info:
+ Public Key Algorithm: GOST R 34.10-2001
+ Key Security Level: High (256 bits)
+
+curve: CryptoPro-C
+digest: GOSTR341194
+private key:
+ 70:c1:b8:07:5a:3f:80:44:d7:e8:85:a6:53:2f:82:1c
+ 97:ec:e4:47:9d:96:18:21:31:58:6d:15:37:01:c7:d4
+
+
+x:
+ 5d:1c:39:b9:14:c7:51:1f:6a:3d:12:8a:a3:ea:f6:c8
+ c7:cb:2e:d7:cf:0c:8b:fd:a9:4a:af:89:b9:2a:9a:f7
+
+
+y:
+ 44:3c:6c:02:2d:a7:b3:61:5d:01:61:8a:f9:26:a2:ad
+ 70:93:10:88:15:d1:46:f3:ee:a4:85:77:96:84:c7:63
+
+
+
+Public Key ID:
+ sha256:C1:09:9D:FE:05:F2:77:97:09:A2:20:03:27:40:35:A8:BE:08:DC:22:4B:6B:4C:8F:72:57:FF:0D:C1:A8:E6:36
+ sha1:B2:C2:4A:DB:56:5C:11:F3:50:59:7B:F5:48:99:B6:81:42:9B:B2:E3
+Public key's random art:
++--[CryptoPro-C]--+
+| ++oo...o.|
+| .+oo.o=o.|
+| ..+...oo.|
+| .o .. |
+| ...S |
+| . o+ . |
+| . o.. E |
+| . +.. |
+| o.. |
++-----------------+
+
+-----BEGIN PRIVATE KEY-----
+MEUCAQAwHAYGKoUDAgITMBIGByqFAwICIwMGByqFAwICHgEEIgQg1McBNxVtWDEh
+GJadR+TslxyCL1OmhejXRIA/Wge4wXA=
+-----END PRIVATE KEY-----
diff --git a/doc/credentials/x509/clikey-gost12.pem b/doc/credentials/x509/clikey-gost12.pem
new file mode 100644
index 0000000000..b5ad09ce8f
--- /dev/null
+++ b/doc/credentials/x509/clikey-gost12.pem
@@ -0,0 +1,49 @@
+Public Key Info:
+ Public Key Algorithm: GOST R 34.10-2012-512
+ Key Security Level: Future (512 bits)
+
+curve: TC26-512-A
+digest: STREEBOG-512
+private key:
+ 4b:b1:4d:85:91:bb:a4:6c:bd:10:6c:2c:34:b2:15:08
+ 14:42:07:b1:54:cc:06:11:bd:f0:71:93:76:fe:33:48
+ 81:75:2f:55:99:b6:e8:cc:e2:85:db:e7:19:2b:dd:74
+ ba:f2:20:f1:d5:15:44:c3:13:ec:3f:bc:f4:98:c9:7d
+
+
+x:
+ 64:01:2d:b3:58:3c:c2:44:22:bc:6f:dd:99:5c:7d:ff
+ 73:b2:e9:bc:8d:e6:dc:c7:b0:37:c1:25:cc:26:3b:d4
+ cd:c3:98:c5:72:13:61:12:ba:b1:01:b0:5a:9d:99:9c
+ b5:91:aa:23:e7:25:89:4e:9c:09:ad:7c:9b:64:8f:46
+
+
+y:
+ 00:cc:01:97:ba:d7:87:37:b4:f4:6c:d5:0d:7c:cc:70
+ dd:e7:99:72:a6:91:c7:51:18:35:5e:64:5a:32:78:ba
+ c6:7b:b5:29:67:b1:6d:cc:9a:64:1d:bd:cc:aa:de:f7
+ 27:22:9f:04:d3:c4:f4:bc:81:98:5a:6e:61:75:6b:b7
+ 2c:
+
+
+Public Key ID:
+ sha256:BD:71:BD:0E:F6:4C:32:2D:11:AA:C5:56:9E:52:28:4F:A2:00:8D:70:29:F5:06:5A:1A:CB:B1:B5:F1:CB:C5:88
+ sha1:3E:ED:2E:49:04:13:BD:0F:56:2E:85:9A:25:DC:07:C3:5E:04:87:4B
+Public key's random art:
++--[TC26-512-A]---+
+| ..=+*o |
+| = Eo= |
+| X O |
+| o O . |
+| oS+ |
+| .... |
+| .o.. |
+| oo |
+| oo |
++-----------------+
+
+-----BEGIN PRIVATE KEY-----
+MGoCAQAwIQYIKoUDBwEBAQIwFQYJKoUDBwECAQIBBggqhQMHAQECAwRCBEB9yZj0
+vD/sE8NEFdXxIPK6dN0rGefbheLM6LaZVS91gUgz/naTcfC9EQbMVLEHQhQIFbI0
+LGwQvWyku5GFTbFL
+-----END PRIVATE KEY-----
diff --git a/doc/credentials/x509/key-gost01.pem b/doc/credentials/x509/key-gost01.pem
new file mode 100644
index 0000000000..e0cd8cf0a1
--- /dev/null
+++ b/doc/credentials/x509/key-gost01.pem
@@ -0,0 +1,42 @@
+Public Key Info:
+ Public Key Algorithm: GOST R 34.10
+ Key Security Level: High (256 bits)
+
+curve: CryptoPro-A
+digest: GOSTR341194
+private key:
+ 66:00:9b:84:f4:bb:7b:25:52:7e:9e:b2:75:c3:84:c2
+ 67:e9:ef:83:94:e7:3b:0e:a3:39:53:0e:57:76:b9:d0
+
+
+x:
+ 00:eb:af:2f:16:fe:e5:c2:02:c8:d9:fc:49:31:81:f3
+ fb:1d:bb:eb:71:ac:d3:dc:52:f6:e2:fa:80:52:9d:45
+ 48:
+
+y:
+ 00:ba:a8:46:1a:e1:cf:11:4d:e4:c7:db:3b:4b:f1:0b
+ 85:25:5e:34:76:9c:fc:70:d0:4d:1d:67:43:e5:88:66
+ 35:
+
+
+Public Key ID:
+ sha256:78:51:EF:CE:F5:49:34:51:04:92:DB:27:30:2B:C7:85:D6:96:62:74:A3:36:0A:D0:05:4B:5E:29:03:11:04:74
+ sha1:2C:12:F8:92:1B:38:0B:60:E3:12:C8:4C:72:53:1E:06:F9:42:B3:5B
+Public key's random art:
++--[CryptoPro-A]--+
+|..+++ |
+|*.+= . |
+|+*.+o |
+|+o+oE. . |
+|=.++o . S |
+|oo.+ . . |
+|. . |
+| |
+| |
++-----------------+
+
+-----BEGIN PRIVATE KEY-----
+MEUCAQAwHAYGKoUDAgITMBIGByqFAwICIwEGByqFAwICHgEEIgQgZgCbhPS7eyVS
+fp6ydcOEwmfp74OU5zsOozlTDld2udA=
+-----END PRIVATE KEY-----
diff --git a/doc/credentials/x509/key-gost12.pem b/doc/credentials/x509/key-gost12.pem
new file mode 100644
index 0000000000..bca4daa133
--- /dev/null
+++ b/doc/credentials/x509/key-gost12.pem
@@ -0,0 +1,49 @@
+Public Key Info:
+ Public Key Algorithm: GOST R 34.10
+ Key Security Level: Future (512 bits)
+
+curve: TC26-512-A
+digest: STREEBOG-512
+private key:
+ 00:9d:31:40:ea:df:20:3e:75:0f:68:e2:06:f2:dc:57
+ fe:04:52:5a:99:7a:9c:32:b0:fc:a0:ac:d3:c0:76:84
+ bf:b2:4b:cc:61:b1:eb:d4:c1:8d:c3:1d:e6:b6:08:e7
+ 6e:38:bc:0b:99:8b:6a:61:a5:97:66:1d:b7:28:e3:06
+ 7d:
+
+x:
+ 68:cd:28:ef:58:58:64:3f:90:c2:a5:63:91:e4:d6:a5
+ a4:7e:87:a1:c8:29:e2:bc:b3:b4:7a:cf:11:ac:70:99
+ cc:a8:01:46:af:59:57:20:ca:dc:4d:41:cb:5c:ac:34
+ 70:ed:c7:7d:40:4d:9a:ef:d0:41:96:22:66:e4:d5:7a
+
+
+y:
+ 00:a9:0f:90:f1:78:94:dc:09:81:27:cc:1c:06:1e:31
+ 99:2d:bf:ae:d6:98:f5:ca:31:8d:c3:7b:cf:74:7e:38
+ f0:df:06:77:01:a6:fa:13:90:70:a3:4b:9b:8b:49:4f
+ 90:4b:19:1a:17:d6:8f:48:41:74:a0:d7:78:a9:08:70
+ 83:
+
+
+Public Key ID:
+ sha256:40:EE:B3:1D:48:9A:43:5D:3C:A0:9B:74:38:53:F0:66:F0:C8:9B:69:32:B2:15:7F:61:AF:A3:63:39:C3:87:65
+ sha1:CD:D2:F2:6B:1E:BE:79:D0:8F:DD:79:84:E3:0F:AA:5C:C9:53:39:34
+Public key's random art:
++--[TC26-512-A]---+
+| |
+| |
+| E |
+| + . o |
+| S +. +. |
+| +...oo..|
+| o.==.+.|
+| o.=oo+oo|
+| oO+. .o|
++-----------------+
+
+-----BEGIN PRIVATE KEY-----
+MGoCAQAwIQYIKoUDBwEBAQIwFQYJKoUDBwECAQIBBggqhQMHAQECAwRCBEB9BuMo
+tx1ml6VhaouZC7w4bucItuYdw43B1OuxYcxLsr+EdsDTrKD8sDKceplaUgT+V9zy
+BuJoD3U+IN/qQDGd
+-----END PRIVATE KEY-----
diff --git a/doc/manpages/Makefile.am b/doc/manpages/Makefile.am
index 66e92efa4b..7513e610e5 100644
--- a/doc/manpages/Makefile.am
+++ b/doc/manpages/Makefile.am
@@ -242,6 +242,7 @@ APIMANS += gnutls_db_set_remove_function.3
APIMANS += gnutls_db_set_retrieve_function.3
APIMANS += gnutls_db_set_store_function.3
APIMANS += gnutls_decode_ber_digest_info.3
+APIMANS += gnutls_decode_gost_rs_value.3
APIMANS += gnutls_decode_rs_value.3
APIMANS += gnutls_deinit.3
APIMANS += gnutls_dh_get_group.3
@@ -282,6 +283,7 @@ APIMANS += gnutls_ecc_curve_get_pk.3
APIMANS += gnutls_ecc_curve_get_size.3
APIMANS += gnutls_ecc_curve_list.3
APIMANS += gnutls_encode_ber_digest_info.3
+APIMANS += gnutls_encode_gost_rs_value.3
APIMANS += gnutls_encode_rs_value.3
APIMANS += gnutls_error_is_fatal.3
APIMANS += gnutls_error_to_alert.3
@@ -303,6 +305,8 @@ APIMANS += gnutls_global_set_log_level.3
APIMANS += gnutls_global_set_mem_functions.3
APIMANS += gnutls_global_set_mutex.3
APIMANS += gnutls_global_set_time_function.3
+APIMANS += gnutls_gost_paramset_get_name.3
+APIMANS += gnutls_gost_paramset_get_oid.3
APIMANS += gnutls_group_get.3
APIMANS += gnutls_group_get_id.3
APIMANS += gnutls_group_get_name.3
@@ -402,6 +406,7 @@ APIMANS += gnutls_ocsp_status_request_get2.3
APIMANS += gnutls_ocsp_status_request_is_checked.3
APIMANS += gnutls_oid_to_digest.3
APIMANS += gnutls_oid_to_ecc_curve.3
+APIMANS += gnutls_oid_to_gost_paramset.3
APIMANS += gnutls_oid_to_mac.3
APIMANS += gnutls_oid_to_pk.3
APIMANS += gnutls_oid_to_sign.3
@@ -574,6 +579,7 @@ APIMANS += gnutls_privkey_export_dsa_raw.3
APIMANS += gnutls_privkey_export_dsa_raw2.3
APIMANS += gnutls_privkey_export_ecc_raw.3
APIMANS += gnutls_privkey_export_ecc_raw2.3
+APIMANS += gnutls_privkey_export_gost_raw2.3
APIMANS += gnutls_privkey_export_openpgp.3
APIMANS += gnutls_privkey_export_pkcs11.3
APIMANS += gnutls_privkey_export_rsa_raw.3
@@ -591,6 +597,7 @@ APIMANS += gnutls_privkey_import_ext.3
APIMANS += gnutls_privkey_import_ext2.3
APIMANS += gnutls_privkey_import_ext3.3
APIMANS += gnutls_privkey_import_ext4.3
+APIMANS += gnutls_privkey_import_gost_raw.3
APIMANS += gnutls_privkey_import_openpgp.3
APIMANS += gnutls_privkey_import_openpgp_raw.3
APIMANS += gnutls_privkey_import_pkcs11.3
@@ -640,6 +647,7 @@ APIMANS += gnutls_pubkey_export_dsa_raw2.3
APIMANS += gnutls_pubkey_export_ecc_raw.3
APIMANS += gnutls_pubkey_export_ecc_raw2.3
APIMANS += gnutls_pubkey_export_ecc_x962.3
+APIMANS += gnutls_pubkey_export_gost_raw2.3
APIMANS += gnutls_pubkey_export_rsa_raw.3
APIMANS += gnutls_pubkey_export_rsa_raw2.3
APIMANS += gnutls_pubkey_get_key_id.3
@@ -652,6 +660,7 @@ APIMANS += gnutls_pubkey_import.3
APIMANS += gnutls_pubkey_import_dsa_raw.3
APIMANS += gnutls_pubkey_import_ecc_raw.3
APIMANS += gnutls_pubkey_import_ecc_x962.3
+APIMANS += gnutls_pubkey_import_gost_raw.3
APIMANS += gnutls_pubkey_import_openpgp.3
APIMANS += gnutls_pubkey_import_openpgp_raw.3
APIMANS += gnutls_pubkey_import_pkcs11.3
@@ -983,6 +992,7 @@ APIMANS += gnutls_x509_crt_get_name_constraints.3
APIMANS += gnutls_x509_crt_get_pk_algorithm.3
APIMANS += gnutls_x509_crt_get_pk_dsa_raw.3
APIMANS += gnutls_x509_crt_get_pk_ecc_raw.3
+APIMANS += gnutls_x509_crt_get_pk_gost_raw.3
APIMANS += gnutls_x509_crt_get_pk_oid.3
APIMANS += gnutls_x509_crt_get_pk_rsa_raw.3
APIMANS += gnutls_x509_crt_get_policy.3
@@ -1125,6 +1135,7 @@ APIMANS += gnutls_x509_privkey_export2.3
APIMANS += gnutls_x509_privkey_export2_pkcs8.3
APIMANS += gnutls_x509_privkey_export_dsa_raw.3
APIMANS += gnutls_x509_privkey_export_ecc_raw.3
+APIMANS += gnutls_x509_privkey_export_gost_raw.3
APIMANS += gnutls_x509_privkey_export_pkcs8.3
APIMANS += gnutls_x509_privkey_export_rsa_raw.3
APIMANS += gnutls_x509_privkey_export_rsa_raw2.3
@@ -1140,6 +1151,7 @@ APIMANS += gnutls_x509_privkey_import.3
APIMANS += gnutls_x509_privkey_import2.3
APIMANS += gnutls_x509_privkey_import_dsa_raw.3
APIMANS += gnutls_x509_privkey_import_ecc_raw.3
+APIMANS += gnutls_x509_privkey_import_gost_raw.3
APIMANS += gnutls_x509_privkey_import_openssl.3
APIMANS += gnutls_x509_privkey_import_pkcs8.3
APIMANS += gnutls_x509_privkey_import_rsa_raw.3
diff --git a/lib/algorithms.h b/lib/algorithms.h
index 468a0c8e96..d105b3cd68 100644
--- a/lib/algorithms.h
+++ b/lib/algorithms.h
@@ -34,6 +34,10 @@
#define GNUTLS_FALLBACK_SCSV_MAJOR 0x56
#define GNUTLS_FALLBACK_SCSV_MINOR 0x00
+#define IS_GOSTEC(x) (((x)==GNUTLS_PK_GOST_01) || \
+ ((x)==GNUTLS_PK_GOST_12_256)|| \
+ ((x)==GNUTLS_PK_GOST_12_512))
+
#define IS_EC(x) (((x)==GNUTLS_PK_ECDSA)||((x)==GNUTLS_PK_ECDH_X25519)||((x)==GNUTLS_PK_EDDSA_ED25519))
#define SIG_SEM_PRE_TLS12 (1<<1)
@@ -406,6 +410,7 @@ typedef struct gnutls_ecc_curve_entry_st {
gnutls_pk_algorithm_t pk;
unsigned size; /* the size in bytes */
unsigned sig_size; /* the size of curve signatures in bytes (EdDSA) */
+ unsigned gost_curve;
} gnutls_ecc_curve_entry_st;
const gnutls_ecc_curve_entry_st
diff --git a/lib/algorithms/ciphers.c b/lib/algorithms/ciphers.c
index 34f94ea7d7..6014da2aea 100644
--- a/lib/algorithms/ciphers.c
+++ b/lib/algorithms/ciphers.c
@@ -183,6 +183,41 @@ static const cipher_entry_st algorithms[] = {
.explicit_iv = 8,
.cipher_iv = 12,
.tagsize = 16},
+ { .name = "GOST28147-TC26Z-CFB",
+ .id = GNUTLS_CIPHER_GOST28147_TC26Z_CFB,
+ .blocksize = 8,
+ .keysize = 32,
+ .type = CIPHER_STREAM,
+ .implicit_iv = 8,
+ .cipher_iv = 8},
+ { .name = "GOST28147-CPA-CFB",
+ .id = GNUTLS_CIPHER_GOST28147_CPA_CFB,
+ .blocksize = 8,
+ .keysize = 32,
+ .type = CIPHER_STREAM,
+ .implicit_iv = 8,
+ .cipher_iv = 8},
+ { .name = "GOST28147-CPB-CFB",
+ .id = GNUTLS_CIPHER_GOST28147_CPB_CFB,
+ .blocksize = 8,
+ .keysize = 32,
+ .type = CIPHER_STREAM,
+ .implicit_iv = 8,
+ .cipher_iv = 8},
+ { .name = "GOST28147-CPC-CFB",
+ .id = GNUTLS_CIPHER_GOST28147_CPC_CFB,
+ .blocksize = 8,
+ .keysize = 32,
+ .type = CIPHER_STREAM,
+ .implicit_iv = 8,
+ .cipher_iv = 8},
+ { .name = "GOST28147-CPD-CFB",
+ .id = GNUTLS_CIPHER_GOST28147_CPD_CFB,
+ .blocksize = 8,
+ .keysize = 32,
+ .type = CIPHER_STREAM,
+ .implicit_iv = 8,
+ .cipher_iv = 8},
{ .name = "3DES-CBC",
.id = GNUTLS_CIPHER_3DES_CBC,
.blocksize = 8,
diff --git a/lib/algorithms/ecc.c b/lib/algorithms/ecc.c
index a757feb7bb..7537708d90 100644
--- a/lib/algorithms/ecc.c
+++ b/lib/algorithms/ecc.c
@@ -79,6 +79,62 @@ static const gnutls_ecc_curve_entry_st ecc_curves[] = {
.size = 32,
.sig_size = 64
},
+ {
+ .name = "CryptoPro-A",
+ .oid = "1.2.643.2.2.35.1",
+ .id = GNUTLS_ECC_CURVE_GOST256CPA,
+ .pk = GNUTLS_PK_UNKNOWN,
+ .size = 32,
+ .gost_curve = 1,
+ },
+ {
+ .name = "CryptoPro-B",
+ .oid = "1.2.643.2.2.35.2",
+ .id = GNUTLS_ECC_CURVE_GOST256CPB,
+ .pk = GNUTLS_PK_UNKNOWN,
+ .size = 32,
+ .gost_curve = 1,
+ },
+ {
+ .name = "CryptoPro-C",
+ .oid = "1.2.643.2.2.35.3",
+ .id = GNUTLS_ECC_CURVE_GOST256CPC,
+ .pk = GNUTLS_PK_UNKNOWN,
+ .size = 32,
+ .gost_curve = 1,
+ },
+ {
+ .name = "CryptoPro-XchA",
+ .oid = "1.2.643.2.2.36.0",
+ .id = GNUTLS_ECC_CURVE_GOST256CPXA,
+ .pk = GNUTLS_PK_UNKNOWN,
+ .size = 32,
+ .gost_curve = 1,
+ },
+ {
+ .name = "CryptoPro-XchB",
+ .oid = "1.2.643.2.2.36.1",
+ .id = GNUTLS_ECC_CURVE_GOST256CPXB,
+ .pk = GNUTLS_PK_UNKNOWN,
+ .size = 32,
+ .gost_curve = 1,
+ },
+ {
+ .name = "TC26-512-A",
+ .oid = "1.2.643.7.1.2.1.2.1",
+ .id = GNUTLS_ECC_CURVE_GOST512A,
+ .pk = GNUTLS_PK_GOST_12_512,
+ .size = 64,
+ .gost_curve = 1,
+ },
+ {
+ .name = "TC26-512-B",
+ .oid = "1.2.643.7.1.2.1.2.2",
+ .id = GNUTLS_ECC_CURVE_GOST512B,
+ .pk = GNUTLS_PK_GOST_12_512,
+ .size = 64,
+ .gost_curve = 1,
+ },
{0, 0, 0}
};
@@ -162,6 +218,19 @@ gnutls_ecc_curve_t gnutls_ecc_curve_get_id(const char *name)
return ret;
}
+static int _gnutls_ecc_pk_compatible(const gnutls_ecc_curve_entry_st *p,
+ gnutls_pk_algorithm_t pk)
+{
+ if (!_gnutls_pk_curve_exists(p->id))
+ return 0;
+
+ if (pk == GNUTLS_PK_GOST_01 ||
+ pk == GNUTLS_PK_GOST_12_256)
+ return p->gost_curve && p->size == 32;
+
+ return pk == p->pk;
+}
+
/*-
* _gnutls_ecc_bits_to_curve:
* @bits: is a security parameter in bits
@@ -175,11 +244,16 @@ gnutls_ecc_curve_t _gnutls_ecc_bits_to_curve(gnutls_pk_algorithm_t pk, int bits)
if (pk == GNUTLS_PK_ECDSA)
ret = GNUTLS_ECC_CURVE_SECP256R1;
+ else if (pk == GNUTLS_PK_GOST_01 ||
+ pk == GNUTLS_PK_GOST_12_256)
+ ret = GNUTLS_ECC_CURVE_GOST256CPA;
+ else if (pk == GNUTLS_PK_GOST_12_512)
+ ret = GNUTLS_ECC_CURVE_GOST512A;
else
ret = GNUTLS_ECC_CURVE_ED25519;
GNUTLS_ECC_CURVE_LOOP(
- if (pk == p->pk && 8 * p->size >= (unsigned)bits && _gnutls_pk_curve_exists(p->id)) {
+ if (_gnutls_ecc_pk_compatible(p, pk) && 8 * p->size >= (unsigned)bits) {
ret = p->id;
break;
}
diff --git a/lib/algorithms/mac.c b/lib/algorithms/mac.c
index f6f9cb3ecf..8fc1da2254 100644
--- a/lib/algorithms/mac.c
+++ b/lib/algorithms/mac.c
@@ -31,6 +31,9 @@
#define MAC_OID_SHA256 "1.2.840.113549.2.9"
#define MAC_OID_SHA384 "1.2.840.113549.2.10"
#define MAC_OID_SHA512 "1.2.840.113549.2.11"
+#define MAC_OID_GOST_R_3411_94 "1.2.643.2.2.10"
+#define MAC_OID_STREEBOG_256 "1.2.643.7.1.1.4.1"
+#define MAC_OID_STREEBOG_512 "1.2.643.7.1.1.4.2"
static const mac_entry_st hash_algorithms[] = {
{.name = "SHA1",
@@ -128,6 +131,27 @@ static const mac_entry_st hash_algorithms[] = {
.output_size = 20,
.key_size = 20,
.block_size = 64},
+ {.name = "GOSTR341194",
+ .oid = HASH_OID_GOST_R_3411_94,
+ .mac_oid = MAC_OID_GOST_R_3411_94,
+ .id = GNUTLS_MAC_GOSTR_94,
+ .output_size = 32,
+ .key_size = 32,
+ .block_size = 32},
+ {.name = "STREEBOG-256",
+ .oid = HASH_OID_STREEBOG_256,
+ .mac_oid = MAC_OID_STREEBOG_256,
+ .id = GNUTLS_MAC_STREEBOG_256,
+ .output_size = 32,
+ .key_size = 32,
+ .block_size = 64},
+ {.name = "STREEBOG-512",
+ .oid = HASH_OID_STREEBOG_512,
+ .mac_oid = MAC_OID_STREEBOG_512,
+ .id = GNUTLS_MAC_STREEBOG_512,
+ .output_size = 64,
+ .key_size = 64,
+ .block_size = 64},
{.name = "MAC-NULL",
.id = GNUTLS_MAC_NULL},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
diff --git a/lib/algorithms/publickey.c b/lib/algorithms/publickey.c
index 677b969c96..0346520b7b 100644
--- a/lib/algorithms/publickey.c
+++ b/lib/algorithms/publickey.c
@@ -126,7 +126,11 @@ static const gnutls_pk_entry pk_algorithms[] = {
.curve = GNUTLS_ECC_CURVE_INVALID }, /* some other broken certificates set RSA with SHA1 as an indicator of RSA */
{ .name = "DSA", .oid = PK_DSA_OID, .id = GNUTLS_PK_DSA,
.curve = GNUTLS_ECC_CURVE_INVALID },
- { .name = "GOST R 34.10-2001", .oid = PK_GOST_R3410_2001_OID, .id = GNUTLS_PK_UNKNOWN,
+ { .name = "GOST R 34.10-2012-512", .oid = PK_GOST_R3410_2012_512_OID, .id = GNUTLS_PK_GOST_12_512,
+ .curve = GNUTLS_ECC_CURVE_INVALID },
+ { .name = "GOST R 34.10-2012-256", .oid = PK_GOST_R3410_2012_256_OID, .id = GNUTLS_PK_GOST_12_256,
+ .curve = GNUTLS_ECC_CURVE_INVALID },
+ { .name = "GOST R 34.10-2001", .oid = PK_GOST_R3410_2001_OID, .id = GNUTLS_PK_GOST_01,
.curve = GNUTLS_ECC_CURVE_INVALID },
{ .name = "GOST R 34.10-94", .oid = PK_GOST_R3410_94_OID, .id = GNUTLS_PK_UNKNOWN,
.curve = GNUTLS_ECC_CURVE_INVALID },
diff --git a/lib/algorithms/secparams.c b/lib/algorithms/secparams.c
index ec4e5e3ee4..47dc2aa8d1 100644
--- a/lib/algorithms/secparams.c
+++ b/lib/algorithms/secparams.c
@@ -88,7 +88,7 @@ gnutls_sec_param_to_pk_bits(gnutls_pk_algorithm_t algo,
if (p->sec_param == param) {
if (algo == GNUTLS_PK_DSA)
ret = p->dsa_bits;
- else if (IS_EC(algo))
+ else if (IS_EC(algo)||IS_GOSTEC(algo))
ret = p->ecc_bits;
else
ret = p->pk_bits; break;
@@ -202,7 +202,7 @@ gnutls_pk_bits_to_sec_param(gnutls_pk_algorithm_t algo, unsigned int bits)
if (bits == 0)
return GNUTLS_SEC_PARAM_UNKNOWN;
- if (IS_EC(algo)) {
+ if (IS_EC(algo)||IS_GOSTEC(algo)) {
GNUTLS_SEC_PARAM_LOOP(
if (p->ecc_bits > bits) {
break;
diff --git a/lib/algorithms/sign.c b/lib/algorithms/sign.c
index 5a45e9fa10..f870ecc545 100644
--- a/lib/algorithms/sign.c
+++ b/lib/algorithms/sign.c
@@ -345,13 +345,29 @@ static const gnutls_sign_entry_st sign_algorithms[] = {
.pk = GNUTLS_PK_EC,
.hash = GNUTLS_DIG_SHA224,
.aid = TLS_SIGN_AID_UNKNOWN},
- {.name = "GOST R 34.10-2001",
+ /* GOST R 34.10-2012-512 */
+ {.name = "GOSTR341012-512",
+ .oid = SIG_GOST_R3410_2012_512_OID,
+ .id = GNUTLS_SIGN_GOST_512,
+ .pk = GNUTLS_PK_GOST_12_512,
+ .hash = GNUTLS_DIG_STREEBOG_512,
+ .aid = TLS_SIGN_AID_UNKNOWN},
+ /* GOST R 34.10-2012-256 */
+ {.name = "GOSTR341012-256",
+ .oid = SIG_GOST_R3410_2012_256_OID,
+ .id = GNUTLS_SIGN_GOST_256,
+ .pk = GNUTLS_PK_GOST_12_256,
+ .hash = GNUTLS_DIG_STREEBOG_256,
+ .aid = TLS_SIGN_AID_UNKNOWN},
+ /* GOST R 34.10-2001 */
+ {.name = "GOSTR341001",
.oid = SIG_GOST_R3410_2001_OID,
- .id = 0,
- .pk = 0,
- .hash = 0,
+ .id = GNUTLS_SIGN_GOST_94,
+ .pk = GNUTLS_PK_GOST_01,
+ .hash = GNUTLS_DIG_GOSTR_94,
.aid = TLS_SIGN_AID_UNKNOWN},
- {.name = "GOST R 34.10-94",
+ /* GOST R 34.10-94 */
+ {.name = "GOSTR341094",
.oid = SIG_GOST_R3410_94_OID,
.id = 0,
.pk = 0,
diff --git a/lib/cert-cred.c b/lib/cert-cred.c
index 4fb609b2f4..d3777e51ff 100644
--- a/lib/cert-cred.c
+++ b/lib/cert-cred.c
@@ -672,6 +672,7 @@ int _gnutls_check_key_cert_match(gnutls_certificate_credentials_t res)
{
gnutls_datum_t test = {(void*)TEST_TEXT, sizeof(TEST_TEXT)-1};
gnutls_datum_t sig = {NULL, 0};
+ gnutls_digest_algorithm_t dig;
int pk, pk2, ret;
unsigned sign_algo;
@@ -700,7 +701,16 @@ int _gnutls_check_key_cert_match(gnutls_certificate_credentials_t res)
return GNUTLS_E_CERTIFICATE_KEY_MISMATCH;
}
- sign_algo = gnutls_pk_to_sign(pk, GNUTLS_DIG_SHA256);
+ if (pk == GNUTLS_PK_GOST_01)
+ dig = GNUTLS_DIG_GOSTR_94;
+ else if (pk == GNUTLS_PK_GOST_12_256)
+ dig = GNUTLS_DIG_STREEBOG_256;
+ else if (pk == GNUTLS_PK_GOST_12_512)
+ dig = GNUTLS_DIG_STREEBOG_512;
+ else
+ dig = GNUTLS_DIG_SHA256;
+
+ sign_algo = gnutls_pk_to_sign(pk, dig);
/* now check if keys really match. We use the sign/verify approach
* because we cannot always obtain the parameters from the abstract
diff --git a/lib/crypto-backend.h b/lib/crypto-backend.h
index d57b1d1135..e410af03e3 100644
--- a/lib/crypto-backend.h
+++ b/lib/crypto-backend.h
@@ -94,7 +94,9 @@ typedef enum {
/* raw unsigned integer format */
GNUTLS_MPI_FORMAT_USG = 0,
/* raw signed integer format - always a leading zero when positive */
- GNUTLS_MPI_FORMAT_STD = 1
+ GNUTLS_MPI_FORMAT_STD = 1,
+ /* raw unsigned integer format, little endian format */
+ GNUTLS_MPI_FORMAT_ULE = 2
} gnutls_bigint_format_t;
/* Multi precision integer arithmetic */
@@ -191,7 +193,8 @@ typedef struct {
unsigned int params_nr; /* the number of parameters */
unsigned int pkflags; /* gnutls_pk_flag_t */
unsigned int qbits; /* GNUTLS_PK_DH */
- gnutls_ecc_curve_t curve; /* GNUTLS_PK_EC, GNUTLS_PK_ED25519 */
+ gnutls_ecc_curve_t curve; /* GNUTLS_PK_EC, GNUTLS_PK_ED25519, GNUTLS_PK_GOST* */
+ gnutls_gost_paramset_t gost_params; /* GNUTLS_PK_GOST_* */
gnutls_datum_t raw_pub; /* used by x25519 */
gnutls_datum_t raw_priv;
@@ -228,6 +231,7 @@ void gnutls_pk_params_init(gnutls_pk_params_st * p);
#define DH_PUBLIC_PARAMS 4
#define RSA_PUBLIC_PARAMS 2
#define ECC_PUBLIC_PARAMS 2
+#define GOST_PUBLIC_PARAMS 2
#define MAX_PRIV_PARAMS_SIZE GNUTLS_MAX_PK_PARAMS /* ok for RSA and DSA */
@@ -237,6 +241,7 @@ void gnutls_pk_params_init(gnutls_pk_params_st * p);
#define DH_PRIVATE_PARAMS 5
#define RSA_PRIVATE_PARAMS 8
#define ECC_PRIVATE_PARAMS 3
+#define GOST_PRIVATE_PARAMS 3
#if MAX_PRIV_PARAMS_SIZE - RSA_PRIVATE_PARAMS < 0
#error INCREASE MAX_PRIV_PARAMS
@@ -246,6 +251,10 @@ void gnutls_pk_params_init(gnutls_pk_params_st * p);
#error INCREASE MAX_PRIV_PARAMS
#endif
+#if MAX_PRIV_PARAMS_SIZE - GOST_PRIVATE_PARAMS < 0
+#error INCREASE MAX_PRIV_PARAMS
+#endif
+
#if MAX_PRIV_PARAMS_SIZE - DSA_PRIVATE_PARAMS < 0
#error INCREASE MAX_PRIV_PARAMS
#endif
@@ -290,6 +299,10 @@ void gnutls_pk_params_init(gnutls_pk_params_st * p);
#define ECC_Y 1
#define ECC_K 2
+#define GOST_X 0
+#define GOST_Y 1
+#define GOST_K 2
+
#define DSA_P 0
#define DSA_Q 1
#define DSA_G 2
diff --git a/lib/gnutls.asn b/lib/gnutls.asn
index 570d8263fd..f4dacdefe7 100644
--- a/lib/gnutls.asn
+++ b/lib/gnutls.asn
@@ -121,4 +121,14 @@ RSAPSSParameters ::= SEQUENCE {
trailerField [3] INTEGER DEFAULT 1
}
+-- GOST R 34.10
+GOSTParameters ::= SEQUENCE {
+ publicKeyParamSet OBJECT IDENTIFIER,
+ digestParamSet OBJECT IDENTIFIER,
+ encryptionParamSet OBJECT IDENTIFIER OPTIONAL
+}
+
+GOSTPrivateKey ::= OCTET STRING
+GOSTPrivateKeyOld ::= INTEGER
+
END
diff --git a/lib/gnutls_asn1_tab.c b/lib/gnutls_asn1_tab.c
index d58f864c0b..06a6ecefa4 100644
--- a/lib/gnutls_asn1_tab.c
+++ b/lib/gnutls_asn1_tab.c
@@ -78,7 +78,7 @@ const asn1_static_node gnutls_asn1_tab[] = {
{ NULL, 2056, "0"},
{ "principalName", 536879106, "PrincipalName"},
{ NULL, 2056, "1"},
- { "RSAPSSParameters", 536870917, NULL },
+ { "RSAPSSParameters", 1610612741, NULL },
{ "hashAlgorithm", 1610637314, "AlgorithmIdentifier"},
{ NULL, 2056, "0"},
{ "maskGenAlgorithm", 1610637314, "AlgorithmIdentifier"},
@@ -89,5 +89,11 @@ const asn1_static_node gnutls_asn1_tab[] = {
{ "trailerField", 536911875, NULL },
{ NULL, 1073741833, "1"},
{ NULL, 2056, "3"},
+ { "GOSTParameters", 1610612741, NULL },
+ { "publicKeyParamSet", 1073741836, NULL },
+ { "digestParamSet", 1073741836, NULL },
+ { "encryptionParamSet", 16396, NULL },
+ { "GOSTPrivateKey", 1073741831, NULL },
+ { "GOSTPrivateKeyOld", 3, NULL },
{ NULL, 0, NULL }
};
diff --git a/lib/includes/gnutls/abstract.h b/lib/includes/gnutls/abstract.h
index d3cd91b93c..5fa0fb99db 100644
--- a/lib/includes/gnutls/abstract.h
+++ b/lib/includes/gnutls/abstract.h
@@ -216,6 +216,13 @@ int gnutls_pubkey_export_ecc_raw2(gnutls_pubkey_t key,
gnutls_datum_t * x, gnutls_datum_t * y,
unsigned flags);
+int gnutls_pubkey_export_gost_raw2(gnutls_pubkey_t key,
+ gnutls_ecc_curve_t * curve,
+ gnutls_digest_algorithm_t * digest,
+ gnutls_gost_paramset_t * paramset,
+ gnutls_datum_t * x, gnutls_datum_t * y,
+ unsigned int flags);
+
#define gnutls_pubkey_get_pk_ecc_raw gnutls_pubkey_export_ecc_raw
int gnutls_pubkey_export_ecc_raw(gnutls_pubkey_t key,
gnutls_ecc_curve_t * curve,
@@ -277,6 +284,14 @@ gnutls_pubkey_import_ecc_raw(gnutls_pubkey_t key,
const gnutls_datum_t * y);
int
+gnutls_pubkey_import_gost_raw(gnutls_pubkey_t key,
+ gnutls_ecc_curve_t curve,
+ gnutls_digest_algorithm_t digest,
+ gnutls_gost_paramset_t paramset,
+ const gnutls_datum_t * x,
+ const gnutls_datum_t * y);
+
+int
gnutls_pubkey_encrypt_data(gnutls_pubkey_t key,
unsigned int flags,
const gnutls_datum_t * plaintext,
@@ -491,6 +506,14 @@ int gnutls_privkey_import_ecc_raw(gnutls_privkey_t key,
const gnutls_datum_t * y,
const gnutls_datum_t * k);
+int gnutls_privkey_import_gost_raw(gnutls_privkey_t key,
+ gnutls_ecc_curve_t curve,
+ gnutls_digest_algorithm_t digest,
+ gnutls_gost_paramset_t paramset,
+ const gnutls_datum_t * x,
+ const gnutls_datum_t * y,
+ const gnutls_datum_t * k);
+
int gnutls_privkey_sign_data(gnutls_privkey_t signer,
gnutls_digest_algorithm_t hash,
@@ -568,6 +591,17 @@ gnutls_privkey_export_ecc_raw2(gnutls_privkey_t key,
gnutls_datum_t * k,
unsigned flags);
+int
+gnutls_privkey_export_gost_raw2(gnutls_privkey_t key,
+ gnutls_ecc_curve_t * curve,
+ gnutls_digest_algorithm_t * digest,
+ gnutls_gost_paramset_t * paramset,
+ gnutls_datum_t * x,
+ gnutls_datum_t * y,
+ gnutls_datum_t * k,
+ unsigned flags);
+
+
int gnutls_x509_crt_privkey_sign(gnutls_x509_crt_t crt,
gnutls_x509_crt_t issuer,
gnutls_privkey_t issuer_key,
diff --git a/lib/includes/gnutls/crypto.h b/lib/includes/gnutls/crypto.h
index 947e25caf9..f20d3463bb 100644
--- a/lib/includes/gnutls/crypto.h
+++ b/lib/includes/gnutls/crypto.h
@@ -247,6 +247,9 @@ gnutls_decode_ber_digest_info(const gnutls_datum_t * info,
int gnutls_decode_rs_value(const gnutls_datum_t * sig_value, gnutls_datum_t *r, gnutls_datum_t *s);
int gnutls_encode_rs_value(gnutls_datum_t * sig_value, const gnutls_datum_t * r, const gnutls_datum_t * s);
+int gnutls_encode_gost_rs_value(gnutls_datum_t * sig_value, const gnutls_datum_t * r, const gnutls_datum_t *s);
+int gnutls_decode_gost_rs_value(const gnutls_datum_t * sig_value, gnutls_datum_t * r, gnutls_datum_t * s);
+
/* *INDENT-OFF* */
#ifdef __cplusplus
}
diff --git a/lib/includes/gnutls/gnutls.h.in b/lib/includes/gnutls/gnutls.h.in
index 41389a39af..7a0a63188d 100644
--- a/lib/includes/gnutls/gnutls.h.in
+++ b/lib/includes/gnutls/gnutls.h.in
@@ -114,6 +114,11 @@ extern "C" {
* @GNUTLS_CIPHER_SALSA20_256: Salsa20 with 256-bit keys.
* @GNUTLS_CIPHER_ESTREAM_SALSA20_256: Estream's Salsa20 variant with 256-bit keys.
* @GNUTLS_CIPHER_CHACHA20_POLY1305: The Chacha20 cipher with the Poly1305 authenticator (AEAD).
+ * @GNUTLS_CIPHER_GOST28147_TC26Z_CFB: GOST 28147-89 (Magma) cipher in CFB mode with TC26 Z S-box.
+ * @GNUTLS_CIPHER_GOST28147_CPA_CFB: GOST 28147-89 (Magma) cipher in CFB mode with CryptoPro A S-box.
+ * @GNUTLS_CIPHER_GOST28147_CPB_CFB: GOST 28147-89 (Magma) cipher in CFB mode with CryptoPro B S-box.
+ * @GNUTLS_CIPHER_GOST28147_CPC_CFB: GOST 28147-89 (Magma) cipher in CFB mode with CryptoPro C S-box.
+ * @GNUTLS_CIPHER_GOST28147_CPD_CFB: GOST 28147-89 (Magma) cipher in CFB mode with CryptoPro D S-box.
* @GNUTLS_CIPHER_IDEA_PGP_CFB: IDEA in CFB mode (placeholder - unsupported).
* @GNUTLS_CIPHER_3DES_PGP_CFB: 3DES in CFB mode (placeholder - unsupported).
* @GNUTLS_CIPHER_CAST5_PGP_CFB: CAST5 in CFB mode (placeholder - unsupported).
@@ -151,6 +156,11 @@ typedef enum gnutls_cipher_algorithm {
GNUTLS_CIPHER_AES_128_CCM_8 = 21,
GNUTLS_CIPHER_AES_256_CCM_8 = 22,
GNUTLS_CIPHER_CHACHA20_POLY1305 = 23,
+ GNUTLS_CIPHER_GOST28147_TC26Z_CFB = 24,
+ GNUTLS_CIPHER_GOST28147_CPA_CFB = 25,
+ GNUTLS_CIPHER_GOST28147_CPB_CFB = 26,
+ GNUTLS_CIPHER_GOST28147_CPC_CFB = 27,
+ GNUTLS_CIPHER_GOST28147_CPD_CFB = 28,
/* used only for PGP internals. Ignored in TLS/SSL
*/
@@ -253,6 +263,9 @@ typedef enum {
* @GNUTLS_MAC_SHA512: HMAC-SHA-512 algorithm.
* @GNUTLS_MAC_SHA224: HMAC-SHA-224 algorithm.
* @GNUTLS_MAC_MD5_SHA1: Combined MD5+SHA1 MAC placeholder.
+ * @GNUTLS_MAC_GOSTR_94: HMAC GOST R 34.10-94 algorithm.
+ * @GNUTLS_MAC_STREEBOG_256: HMAC GOST R 34.10-2001 (Streebog) algorithm, 256 bit.
+ * @GNUTLS_MAC_STREEBOG_512: HMAC GOST R 34.10-2001 (Streebog) algorithm, 512 bit.
* @GNUTLS_MAC_AEAD: MAC implicit through AEAD cipher.
* @GNUTLS_MAC_UMAC_96: The UMAC-96 MAC algorithm.
* @GNUTLS_MAC_UMAC_128: The UMAC-128 MAC algorithm.
@@ -276,11 +289,14 @@ typedef enum {
GNUTLS_MAC_SHA3_384 = 12, /* reserved: no implementation */
GNUTLS_MAC_SHA3_512 = 13, /* reserved: no implementation */
GNUTLS_MAC_MD5_SHA1 = 14, /* reserved: no implementation */
+ GNUTLS_MAC_GOSTR_94 = 15,
+ GNUTLS_MAC_STREEBOG_256 = 16,
+ GNUTLS_MAC_STREEBOG_512 = 17,
/* If you add anything here, make sure you align with
gnutls_digest_algorithm_t. */
GNUTLS_MAC_AEAD = 200, /* indicates that MAC is on the cipher */
GNUTLS_MAC_UMAC_96 = 201,
- GNUTLS_MAC_UMAC_128 = 202
+ GNUTLS_MAC_UMAC_128 = 202,
} gnutls_mac_algorithm_t;
/**
@@ -300,6 +316,9 @@ typedef enum {
* @GNUTLS_DIG_SHA3_384: SHA3-384 algorithm.
* @GNUTLS_DIG_SHA3_512: SHA3-512 algorithm.
* @GNUTLS_DIG_MD5_SHA1: Combined MD5+SHA1 algorithm.
+ * @GNUTLS_DIG_GOSTR_94: GOST R 34.10-94 algorithm.
+ * @GNUTLS_DIG_STREEBOG_256: GOST R 34.10-2001 (Streebog) algorithm, 256 bit.
+ * @GNUTLS_DIG_STREEBOG_512: GOST R 34.10-2001 (Streebog) algorithm, 512 bit.
*
* Enumeration of different digest (hash) algorithms.
*/
@@ -318,7 +337,10 @@ typedef enum {
GNUTLS_DIG_SHA3_256 = GNUTLS_MAC_SHA3_256,
GNUTLS_DIG_SHA3_384 = GNUTLS_MAC_SHA3_384,
GNUTLS_DIG_SHA3_512 = GNUTLS_MAC_SHA3_512,
- GNUTLS_DIG_MD5_SHA1 = GNUTLS_MAC_MD5_SHA1
+ GNUTLS_DIG_MD5_SHA1 = GNUTLS_MAC_MD5_SHA1,
+ GNUTLS_DIG_GOSTR_94 = GNUTLS_MAC_GOSTR_94,
+ GNUTLS_DIG_STREEBOG_256 = GNUTLS_MAC_STREEBOG_256,
+ GNUTLS_DIG_STREEBOG_512 = GNUTLS_MAC_STREEBOG_512
/* If you add anything here, make sure you align with
gnutls_mac_algorithm_t. */
} gnutls_digest_algorithm_t;
@@ -746,6 +768,9 @@ typedef enum gnutls_certificate_print_formats {
* @GNUTLS_PK_ECDSA: Elliptic curve algorithm. These parameters are compatible with the ECDSA and ECDH algorithm.
* @GNUTLS_PK_ECDH_X25519: Elliptic curve algorithm, restricted to ECDH as per rfc7748.
* @GNUTLS_PK_EDDSA_ED25519: Edwards curve Digital signature algorithm. Used with SHA512 on signatures.
+ * @GNUTLS_PK_GOST_01: GOST R 34.10-2001 algorithm per rfc5832.
+ * @GNUTLS_PK_GOST_12_256: GOST R 34.10-2012 algorithm, 256-bit key per rfc7091.
+ * @GNUTLS_PK_GOST_12_512: GOST R 34.10-2012 algorithm, 512-bit key per rfc7091.
*
* Enumeration of different public-key algorithms.
*/
@@ -758,7 +783,10 @@ typedef enum {
GNUTLS_PK_ECDH_X25519 = 5,
GNUTLS_PK_RSA_PSS = 6,
GNUTLS_PK_EDDSA_ED25519 = 7,
- GNUTLS_PK_MAX = GNUTLS_PK_EDDSA_ED25519
+ GNUTLS_PK_GOST_01 = 8,
+ GNUTLS_PK_GOST_12_256 = 9,
+ GNUTLS_PK_GOST_12_512 = 10,
+ GNUTLS_PK_MAX = GNUTLS_PK_GOST_12_512
} gnutls_pk_algorithm_t;
@@ -819,6 +847,9 @@ const char *gnutls_pk_algorithm_get_name(gnutls_pk_algorithm_t algorithm);
* @GNUTLS_SIGN_RSA_PSS_SHA384: Digital signature algorithm RSA with SHA-384, with PSS padding (RSA-PSS certificate).
* @GNUTLS_SIGN_RSA_PSS_SHA512: Digital signature algorithm RSA with SHA-512, with PSS padding (RSA-PSS certificate).
* @GNUTLS_SIGN_EDDSA_ED25519: Digital signature algorithm EdDSA with Ed25519 curve.
+ * @GNUTLS_SIGN_GOST_94: Digital signature algorithm GOST R 34.10-2001 with GOST R 34.11-94
+ * @GNUTLS_SIGN_GOST_256: Digital signature algorithm GOST R 34.10-2001 with GOST R 34.11-2012 256 bit
+ * @GNUTLS_SIGN_GOST_512: Digital signature algorithm GOST R 34.10-2001 with GOST R 34.11-2012 512 bit
*
* Enumeration of different digital signature algorithms.
*/
@@ -871,7 +902,11 @@ typedef enum {
GNUTLS_SIGN_RSA_PSS_RSAE_SHA256 = 40,
GNUTLS_SIGN_RSA_PSS_RSAE_SHA384 = 41,
GNUTLS_SIGN_RSA_PSS_RSAE_SHA512 = 42,
- GNUTLS_SIGN_MAX = GNUTLS_SIGN_RSA_PSS_RSAE_SHA512
+
+ GNUTLS_SIGN_GOST_94 = 43,
+ GNUTLS_SIGN_GOST_256 = 44,
+ GNUTLS_SIGN_GOST_512 = 45,
+ GNUTLS_SIGN_MAX = GNUTLS_SIGN_GOST_512
} gnutls_sign_algorithm_t;
/**
@@ -884,6 +919,13 @@ typedef enum {
* @GNUTLS_ECC_CURVE_SECP521R1: the SECP521R1 curve
* @GNUTLS_ECC_CURVE_X25519: the X25519 curve (ECDH only)
* @GNUTLS_ECC_CURVE_ED25519: the Ed25519 curve
+ * @GNUTLS_ECC_CURVE_GOST256CPA: GOST R 34.10 CryptoPro 256 A curve
+ * @GNUTLS_ECC_CURVE_GOST256CPB: GOST R 34.10 CryptoPro 256 B curve
+ * @GNUTLS_ECC_CURVE_GOST256CPC: GOST R 34.10 CryptoPro 256 C curve
+ * @GNUTLS_ECC_CURVE_GOST256CPXA: GOST R 34.10 CryptoPro 256 XchA curve
+ * @GNUTLS_ECC_CURVE_GOST256CPXB: GOST R 34.10 CryptoPro 256 XchB curve
+ * @GNUTLS_ECC_CURVE_GOST512A: GOST R 34.10 TC26 512 A curve
+ * @GNUTLS_ECC_CURVE_GOST512B: GOST R 34.10 TC26 512 B curve
*
* Enumeration of ECC curves.
*/
@@ -896,7 +938,14 @@ typedef enum {
GNUTLS_ECC_CURVE_SECP192R1,
GNUTLS_ECC_CURVE_X25519,
GNUTLS_ECC_CURVE_ED25519,
- GNUTLS_ECC_CURVE_MAX = GNUTLS_ECC_CURVE_ED25519
+ GNUTLS_ECC_CURVE_GOST256CPA,
+ GNUTLS_ECC_CURVE_GOST256CPB,
+ GNUTLS_ECC_CURVE_GOST256CPC,
+ GNUTLS_ECC_CURVE_GOST256CPXA,
+ GNUTLS_ECC_CURVE_GOST256CPXB,
+ GNUTLS_ECC_CURVE_GOST512A,
+ GNUTLS_ECC_CURVE_GOST512B,
+ GNUTLS_ECC_CURVE_MAX = GNUTLS_ECC_CURVE_GOST512B
} gnutls_ecc_curve_t;
/**
@@ -983,6 +1032,25 @@ typedef enum {
GNUTLS_CB_TLS_UNIQUE
} gnutls_channel_binding_t;
+/**
+ * gnutls_gost_paramset_t:
+ * @GNUTLS_GOST_PARAMSET_UNKNOWN: Unknown/default parameter set
+ * @GNUTLS_GOST_PARAMSET_TC26_Z: Specified by TC26, see rfc7836
+ * @GNUTLS_GOST_PARAMSET_CP_A: CryptoPro-A, see rfc4357
+ * @GNUTLS_GOST_PARAMSET_CP_B: CryptoPro-B, see rfc4357
+ * @GNUTLS_GOST_PARAMSET_CP_C: CryptoPro-C, see rfc4357
+ * @GNUTLS_GOST_PARAMSET_CP_D: CryptoPro-D, see rfc4357
+ *
+ * Enumeration of different GOST 28147 parameter sets.
+ */
+typedef enum {
+ GNUTLS_GOST_PARAMSET_UNKNOWN = 0,
+ GNUTLS_GOST_PARAMSET_TC26_Z,
+ GNUTLS_GOST_PARAMSET_CP_A,
+ GNUTLS_GOST_PARAMSET_CP_B,
+ GNUTLS_GOST_PARAMSET_CP_C,
+ GNUTLS_GOST_PARAMSET_CP_D
+} gnutls_gost_paramset_t;
/* If you want to change this, then also change the define in
* gnutls_int.h, and recompile.
@@ -1112,6 +1180,11 @@ const char *
const char *gnutls_sign_get_oid(gnutls_sign_algorithm_t sign) __GNUTLS_CONST__;
+const char *
+ gnutls_gost_paramset_get_name(gnutls_gost_paramset_t param) __GNUTLS_CONST__;
+const char *
+ gnutls_gost_paramset_get_oid(gnutls_gost_paramset_t param) __GNUTLS_CONST__;
+
size_t
gnutls_cipher_get_key_size(gnutls_cipher_algorithm_t algorithm) __GNUTLS_CONST__;
size_t
@@ -1169,6 +1242,8 @@ gnutls_sign_algorithm_t
gnutls_oid_to_sign(const char *oid) __GNUTLS_CONST__;
gnutls_ecc_curve_t
gnutls_oid_to_ecc_curve(const char *oid) __GNUTLS_CONST__;
+gnutls_gost_paramset_t
+ gnutls_oid_to_gost_paramset(const char *oid) __GNUTLS_CONST__;
/* list supported algorithms */
const gnutls_ecc_curve_t *
diff --git a/lib/includes/gnutls/x509.h b/lib/includes/gnutls/x509.h
index fef901a101..cd54e8c4ca 100644
--- a/lib/includes/gnutls/x509.h
+++ b/lib/includes/gnutls/x509.h
@@ -455,6 +455,11 @@ int gnutls_x509_crt_get_pk_ecc_raw(gnutls_x509_crt_t crt,
gnutls_ecc_curve_t * curve,
gnutls_datum_t * x,
gnutls_datum_t * y);
+int gnutls_x509_crt_get_pk_gost_raw(gnutls_x509_crt_t crt,
+ gnutls_ecc_curve_t * curve,
+ gnutls_digest_algorithm_t * digest,
+ gnutls_gost_paramset_t *paramset,
+ gnutls_datum_t * x, gnutls_datum_t * y);
int gnutls_x509_crt_get_subject_alt_name(gnutls_x509_crt_t cert,
unsigned int seq,
@@ -1093,6 +1098,11 @@ unsigned gnutls_x509_crt_check_key_purpose(gnutls_x509_crt_t cert,
* @GNUTLS_PKCS_PBES2_AES_256: PBES2 AES-256.
* @GNUTLS_PKCS_PBES2_DES: PBES2 single DES.
* @GNUTLS_PKCS_PBES2_DES_MD5: PBES1 with single DES; for compatibility with openssl only.
+ * @GNUTLS_PKCS_PBES2_GOST_TC26Z: PBES2 GOST 28147-89 CFB with TC26-Z S-box.
+ * @GNUTLS_PKCS_PBES2_GOST_CPA: PBES2 GOST 28147-89 CFB with CryptoPro-A S-box.
+ * @GNUTLS_PKCS_PBES2_GOST_CPB: PBES2 GOST 28147-89 CFB with CryptoPro-B S-box.
+ * @GNUTLS_PKCS_PBES2_GOST_CPC: PBES2 GOST 28147-89 CFB with CryptoPro-C S-box.
+ * @GNUTLS_PKCS_PBES2_GOST_CPD: PBES2 GOST 28147-89 CFB with CryptoPro-D S-box.
*
* Enumeration of different PKCS encryption flags.
*/
@@ -1107,7 +1117,12 @@ typedef enum gnutls_pkcs_encrypt_flags_t {
GNUTLS_PKCS_PBES2_AES_256 = 1<<7,
GNUTLS_PKCS_NULL_PASSWORD = 1<<8,
GNUTLS_PKCS_PBES2_DES = 1<<9,
- GNUTLS_PKCS_PBES1_DES_MD5 = 1<<10
+ GNUTLS_PKCS_PBES1_DES_MD5 = 1<<10,
+ GNUTLS_PKCS_PBES2_GOST_TC26Z = 1<<11,
+ GNUTLS_PKCS_PBES2_GOST_CPA = 1<<12,
+ GNUTLS_PKCS_PBES2_GOST_CPB = 1<<13,
+ GNUTLS_PKCS_PBES2_GOST_CPC = 1<<14,
+ GNUTLS_PKCS_PBES2_GOST_CPD = 1<<15
} gnutls_pkcs_encrypt_flags_t;
#define GNUTLS_PKCS_CIPHER_MASK(x) ((x)&(~(GNUTLS_PKCS_NULL_PASSWORD)))
@@ -1119,6 +1134,11 @@ typedef enum gnutls_pkcs_encrypt_flags_t {
#define GNUTLS_PKCS_USE_PBES2_AES_128 GNUTLS_PKCS_PBES2_AES_128
#define GNUTLS_PKCS_USE_PBES2_AES_192 GNUTLS_PKCS_PBES2_AES_192
#define GNUTLS_PKCS_USE_PBES2_AES_256 GNUTLS_PKCS_PBES2_AES_256
+#define GNUTLS_PKCS_USE_PBES2_GOST_TC26Z GNUTLS_PKCS_PBES2_GOST_TC26Z
+#define GNUTLS_PKCS_USE_PBES2_GOST_CPA GNUTLS_PKCS_PBES2_GOST_CPA
+#define GNUTLS_PKCS_USE_PBES2_GOST_CPB GNUTLS_PKCS_PBES2_GOST_CPB
+#define GNUTLS_PKCS_USE_PBES2_GOST_CPC GNUTLS_PKCS_PBES2_GOST_CPC
+#define GNUTLS_PKCS_USE_PBES2_GOST_CPD GNUTLS_PKCS_PBES2_GOST_CPD
const char *gnutls_pkcs_schema_get_name(unsigned int schema);
const char *gnutls_pkcs_schema_get_oid(unsigned int schema);
@@ -1178,6 +1198,13 @@ int gnutls_x509_privkey_import_ecc_raw(gnutls_x509_privkey_t key,
const gnutls_datum_t * x,
const gnutls_datum_t * y,
const gnutls_datum_t * k);
+int gnutls_x509_privkey_import_gost_raw(gnutls_x509_privkey_t key,
+ gnutls_ecc_curve_t curve,
+ gnutls_digest_algorithm_t digest,
+ gnutls_gost_paramset_t paramset,
+ const gnutls_datum_t * x,
+ const gnutls_datum_t * y,
+ const gnutls_datum_t * k);
int gnutls_x509_privkey_fix(gnutls_x509_privkey_t key);
@@ -1285,6 +1312,13 @@ int gnutls_x509_privkey_export_ecc_raw(gnutls_x509_privkey_t key,
gnutls_datum_t * x,
gnutls_datum_t * y,
gnutls_datum_t * k);
+int gnutls_x509_privkey_export_gost_raw(gnutls_x509_privkey_t key,
+ gnutls_ecc_curve_t * curve,
+ gnutls_digest_algorithm_t * digest,
+ gnutls_gost_paramset_t * paramset,
+ gnutls_datum_t * x,
+ gnutls_datum_t * y,
+ gnutls_datum_t * k);
int gnutls_x509_privkey_sign_data(gnutls_x509_privkey_t key,
gnutls_digest_algorithm_t digest,
diff --git a/lib/libgnutls.map b/lib/libgnutls.map
index f95fe0a846..597ebc1ebd 100644
--- a/lib/libgnutls.map
+++ b/lib/libgnutls.map
@@ -1221,6 +1221,18 @@ GNUTLS_3_6_3
gnutls_pkcs11_obj_get_ptr;
gnutls_session_ticket_send;
gnutls_aead_cipher_encryptv;
+ gnutls_gost_paramset_get_name;
+ gnutls_gost_paramset_get_oid;
+ gnutls_oid_to_gost_paramset;
+ gnutls_decode_gost_rs_value;
+ gnutls_encode_gost_rs_value;
+ gnutls_pubkey_export_gost_raw2;
+ gnutls_pubkey_import_gost_raw;
+ gnutls_x509_crt_get_pk_gost_raw;
+ gnutls_privkey_export_gost_raw2;
+ gnutls_privkey_import_gost_raw;
+ gnutls_x509_privkey_export_gost_raw;
+ gnutls_x509_privkey_import_gost_raw;
} GNUTLS_3_6_2;
GNUTLS_FIPS140_3_4 {
diff --git a/lib/mpi.c b/lib/mpi.c
index afe1c0ea7d..083afe0fa7 100644
--- a/lib/mpi.c
+++ b/lib/mpi.c
@@ -153,6 +153,28 @@ _gnutls_mpi_init_scan_nz(bigint_t * ret_mpi, const void *buffer, size_t nbytes)
return 0;
}
+int
+_gnutls_mpi_init_scan_le(bigint_t * ret_mpi, const void *buffer, size_t nbytes)
+{
+ bigint_t r;
+ int ret;
+
+ ret = _gnutls_mpi_init(&r);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+
+ ret = _gnutls_mpi_scan_le(r, buffer, nbytes);
+ if (ret < 0) {
+ gnutls_assert();
+ _gnutls_mpi_release(&r);
+ return ret;
+ }
+
+ *ret_mpi = r;
+
+ return 0;
+}
+
/* Always has the first bit zero */
int _gnutls_mpi_dprint_lz(const bigint_t a, gnutls_datum_t * dest)
{
@@ -248,13 +270,43 @@ _gnutls_mpi_dprint_size(const bigint_t a, gnutls_datum_t * dest,
return 0;
}
+/* like _gnutls_mpi_dprint_size, but prints into preallocated byte buffer */
+int
+_gnutls_mpi_bprint_size(const bigint_t a, uint8_t *buf, size_t size)
+{
+ int result;
+ size_t bytes = 0;
+
+ result = _gnutls_mpi_print(a, NULL, &bytes);
+ if (result != GNUTLS_E_SHORT_MEMORY_BUFFER)
+ return gnutls_assert_val(result);
+
+ if (bytes <= size) {
+ unsigned i;
+ size_t diff = size - bytes;
+
+ for (i = 0; i < diff; i++)
+ buf[i] = 0;
+ result = _gnutls_mpi_print(a, &buf[diff], &bytes);
+ } else {
+ result = _gnutls_mpi_print(a, buf, &bytes);
+ }
+
+ return result;
+}
+
+/* Flags for __gnutls_x509_read_int() and __gnutls_x509_write_int */
+#define GNUTLS_X509_INT_OVERWRITE (1 << 0)
+#define GNUTLS_X509_INT_LE (1 << 1)
+#define GNUTLS_X509_INT_LZ (1 << 2) /* write only */
+
/* this function reads an integer
* from asn1 structs. Combines the read and mpi_scan
* steps.
*/
static int
__gnutls_x509_read_int(ASN1_TYPE node, const char *value,
- bigint_t * ret_mpi, int overwrite)
+ bigint_t * ret_mpi, unsigned int flags)
{
int result;
uint8_t *tmpstr = NULL;
@@ -280,9 +332,14 @@ __gnutls_x509_read_int(ASN1_TYPE node, const char *value,
return _gnutls_asn2err(result);
}
- result = _gnutls_mpi_init_scan(ret_mpi, tmpstr, tmpstr_size);
+ if (flags & GNUTLS_X509_INT_LE)
+ result = _gnutls_mpi_init_scan_le(ret_mpi, tmpstr,
+ tmpstr_size);
+ else
+ result = _gnutls_mpi_init_scan(ret_mpi, tmpstr,
+ tmpstr_size);
- if (overwrite)
+ if (flags & GNUTLS_X509_INT_OVERWRITE)
zeroize_key(tmpstr, tmpstr_size);
gnutls_free(tmpstr);
@@ -298,29 +355,42 @@ int
_gnutls_x509_read_int(ASN1_TYPE node, const char *value,
bigint_t * ret_mpi)
{
- return __gnutls_x509_read_int(node, value, ret_mpi, 0);
+ return __gnutls_x509_read_int(node, value, ret_mpi,
+ 0);
}
int
_gnutls_x509_read_key_int(ASN1_TYPE node, const char *value,
bigint_t * ret_mpi)
{
- return __gnutls_x509_read_int(node, value, ret_mpi, 1);
+ return __gnutls_x509_read_int(node, value, ret_mpi,
+ GNUTLS_X509_INT_OVERWRITE);
+}
+
+int
+_gnutls_x509_read_key_int_le(ASN1_TYPE node, const char *value,
+ bigint_t * ret_mpi)
+{
+ return __gnutls_x509_read_int(node, value, ret_mpi,
+ GNUTLS_X509_INT_OVERWRITE |
+ GNUTLS_X509_INT_LE);
}
/* Writes the specified integer into the specified node.
*/
static int
__gnutls_x509_write_int(ASN1_TYPE node, const char *value, bigint_t mpi,
- int lz, int overwrite)
+ unsigned int flags)
{
uint8_t *tmpstr;
size_t s_len;
int result;
s_len = 0;
- if (lz)
+ if (flags & GNUTLS_X509_INT_LZ)
result = _gnutls_mpi_print_lz(mpi, NULL, &s_len);
+ else if (GNUTLS_X509_INT_LE)
+ result = _gnutls_mpi_print_le(mpi, NULL, &s_len);
else
result = _gnutls_mpi_print(mpi, NULL, &s_len);
@@ -335,8 +405,10 @@ __gnutls_x509_write_int(ASN1_TYPE node, const char *value, bigint_t mpi,
return GNUTLS_E_MEMORY_ERROR;
}
- if (lz)
+ if (flags & GNUTLS_X509_INT_LZ)
result = _gnutls_mpi_print_lz(mpi, tmpstr, &s_len);
+ else if (GNUTLS_X509_INT_LE)
+ result = _gnutls_mpi_print_le(mpi, tmpstr, &s_len);
else
result = _gnutls_mpi_print(mpi, tmpstr, &s_len);
@@ -347,8 +419,8 @@ __gnutls_x509_write_int(ASN1_TYPE node, const char *value, bigint_t mpi,
}
result = asn1_write_value(node, value, tmpstr, s_len);
-
- if (overwrite)
+
+ if (flags & GNUTLS_X509_INT_OVERWRITE)
zeroize_key(tmpstr, s_len);
gnutls_free(tmpstr);
@@ -365,12 +437,23 @@ int
_gnutls_x509_write_int(ASN1_TYPE node, const char *value, bigint_t mpi,
int lz)
{
- return __gnutls_x509_write_int(node, value, mpi, lz, 0);
+ return __gnutls_x509_write_int(node, value, mpi,
+ lz ? GNUTLS_X509_INT_LZ : 0);
}
int
_gnutls_x509_write_key_int(ASN1_TYPE node, const char *value, bigint_t mpi,
int lz)
{
- return __gnutls_x509_write_int(node, value, mpi, lz, 1);
+ return __gnutls_x509_write_int(node, value, mpi,
+ (lz ? GNUTLS_X509_INT_LZ : 0) |
+ GNUTLS_X509_INT_OVERWRITE);
+}
+
+int
+_gnutls_x509_write_key_int_le(ASN1_TYPE node, const char *value, bigint_t mpi)
+{
+ return __gnutls_x509_write_int(node, value, mpi,
+ GNUTLS_X509_INT_OVERWRITE |
+ GNUTLS_X509_INT_LE);
}
diff --git a/lib/mpi.h b/lib/mpi.h
index af3e37b775..e9747e391d 100644
--- a/lib/mpi.h
+++ b/lib/mpi.h
@@ -57,8 +57,10 @@ bigint_t _gnutls_mpi_random_modp(bigint_t, bigint_t p,
#define _gnutls_prime_check _gnutls_mpi_ops.bigint_prime_check
#define _gnutls_mpi_print(x,y,z) _gnutls_mpi_ops.bigint_print(x,y,z,GNUTLS_MPI_FORMAT_USG)
#define _gnutls_mpi_print_lz(x,y,z) _gnutls_mpi_ops.bigint_print(x,y,z,GNUTLS_MPI_FORMAT_STD)
+#define _gnutls_mpi_print_le(x,y,z) _gnutls_mpi_ops.bigint_print(x,y,z,GNUTLS_MPI_FORMAT_ULE)
#define _gnutls_mpi_copy _gnutls_mpi_ops.bigint_copy
#define _gnutls_mpi_scan(r, b, s) _gnutls_mpi_ops.bigint_scan(r, b, s, GNUTLS_MPI_FORMAT_USG)
+#define _gnutls_mpi_scan_le(r, b, s) _gnutls_mpi_ops.bigint_scan(r, b, s, GNUTLS_MPI_FORMAT_ULE)
inline static
void _gnutls_mpi_release(bigint_t * x)
@@ -74,11 +76,14 @@ int _gnutls_mpi_init_scan(bigint_t * ret_mpi, const void *buffer,
size_t nbytes);
int _gnutls_mpi_init_scan_nz(bigint_t * ret_mpi, const void *buffer,
size_t nbytes);
+int _gnutls_mpi_init_scan_le(bigint_t * ret_mpi, const void *buffer,
+ size_t nbytes);
int _gnutls_mpi_dprint_lz(const bigint_t a, gnutls_datum_t * dest);
int _gnutls_mpi_dprint(const bigint_t a, gnutls_datum_t * dest);
int _gnutls_mpi_dprint_size(const bigint_t a, gnutls_datum_t * dest,
size_t size);
+int _gnutls_mpi_bprint_size(const bigint_t a, uint8_t *buf, size_t size);
typedef int (*mpi_dprint_func)(const bigint_t a, gnutls_datum_t * dest);
diff --git a/lib/nettle/Makefile.am b/lib/nettle/Makefile.am
index deb5cc75ea..bd5ec45901 100644
--- a/lib/nettle/Makefile.am
+++ b/lib/nettle/Makefile.am
@@ -59,3 +59,28 @@ if ENABLE_FIPS140
libcrypto_la_SOURCES += rnd-fips.c int/drbg-aes-self-test.c \
int/drbg-aes.c int/drbg-aes.h
endif
+
+if ENABLE_GOST
+libcrypto_la_SOURCES += \
+ gost/nettle-write.h \
+ gost/gost28147.c gost/gost28147.h \
+ gost/gosthash94.c gost/gosthash94.h gost/gosthash94-meta.c \
+ gost/streebog.c gost/streebog.h gost/streebog-meta.c \
+ gost/hmac-gosthash94.c gost/hmac-streebog.c gost/hmac-gost.h
+
+libcrypto_la_SOURCES += \
+ gost/bignum-le.c gost/bignum-le.h
+
+libcrypto_la_SOURCES += \
+ gost/pbkdf2-hmac-gosthash94.c gost/pbkdf2-hmac-streebog.c \
+ gost/pbkdf2-gost.h
+
+libcrypto_la_SOURCES += \
+ gost/nettle-internal.h \
+ gost/ecc-gost256cpa.c gost/ecc-gost256cpa-32.h gost/ecc-gost256cpa-64.h\
+ gost/ecc-gost512a.c gost/ecc-gost512a-32.h gost/ecc-gost512a-64.h \
+ gost/ecc-internal.h gost/gmp-glue.h \
+ gost/ecc-gostdsa-sign.c gost/ecc-gostdsa-verify.c \
+ gost/gostdsa-sign.c gost/gostdsa-verify.c \
+ gost/gostdsa.h gost/ecc-gost-curve.h gost/ecc-gost-hash.c
+endif
diff --git a/lib/nettle/cipher.c b/lib/nettle/cipher.c
index 8832d49de6..24ecf8ded3 100644
--- a/lib/nettle/cipher.c
+++ b/lib/nettle/cipher.c
@@ -33,6 +33,11 @@
#include <nettle/arctwo.h>
#include <nettle/salsa20.h>
#include <nettle/des.h>
+#include <nettle/version.h>
+#if ENABLE_GOST
+#include "gost/gost28147.h"
+#include <nettle/cfb.h>
+#endif
#include <nettle/nettle-meta.h>
#include <nettle/cbc.h>
#include <nettle/gcm.h>
@@ -130,6 +135,61 @@ _cbc_decrypt(struct nettle_cipher_ctx *ctx, size_t length, uint8_t * dst,
length, dst, src);
}
+#if ENABLE_GOST
+static void
+_cfb_encrypt(struct nettle_cipher_ctx *ctx, size_t length, uint8_t * dst,
+ const uint8_t * src)
+{
+ cfb_encrypt(ctx->ctx_ptr, ctx->cipher->encrypt_block,
+ ctx->iv_size, ctx->iv,
+ length, dst, src);
+}
+
+static void
+_cfb_decrypt(struct nettle_cipher_ctx *ctx, size_t length, uint8_t * dst,
+ const uint8_t * src)
+{
+ cfb_decrypt(ctx->ctx_ptr, ctx->cipher->encrypt_block,
+ ctx->iv_size, ctx->iv,
+ length, dst, src);
+}
+
+static void
+_gost28147_set_key_tc26z(void *ctx, const uint8_t *key)
+{
+ gost28147_set_key(ctx, key);
+ gost28147_set_param(ctx, &gost28147_param_TC26_Z);
+}
+
+static void
+_gost28147_set_key_cpa(void *ctx, const uint8_t *key)
+{
+ gost28147_set_key(ctx, key);
+ gost28147_set_param(ctx, &gost28147_param_CryptoPro_A);
+}
+
+static void
+_gost28147_set_key_cpb(void *ctx, const uint8_t *key)
+{
+ gost28147_set_key(ctx, key);
+ gost28147_set_param(ctx, &gost28147_param_CryptoPro_A);
+}
+
+static void
+_gost28147_set_key_cpc(void *ctx, const uint8_t *key)
+{
+ gost28147_set_key(ctx, key);
+ gost28147_set_param(ctx, &gost28147_param_CryptoPro_A);
+}
+
+static void
+_gost28147_set_key_cpd(void *ctx, const uint8_t *key)
+{
+ gost28147_set_key(ctx, key);
+ gost28147_set_param(ctx, &gost28147_param_CryptoPro_A);
+}
+#endif
+
static void
_ccm_encrypt(struct nettle_cipher_ctx *ctx,
size_t nonce_size, const void *nonce,
@@ -489,6 +549,73 @@ static const struct nettle_cipher_st builtin_ciphers[] = {
.set_iv = (setiv_func)_chacha_poly1305_set_nonce,
.max_iv_size = CHACHA_POLY1305_NONCE_SIZE,
},
+#if ENABLE_GOST
+ {
+ .algo = GNUTLS_CIPHER_GOST28147_TC26Z_CFB,
+ .block_size = GOST28147_BLOCK_SIZE,
+ .key_size = GOST28147_KEY_SIZE,
+ .encrypt_block = (nettle_cipher_func*)gost28147_encrypt_for_cfb,
+ .decrypt_block = (nettle_cipher_func*)gost28147_encrypt_for_cfb,
+
+ .ctx_size = sizeof(struct CFB_CTX(struct gost28147_ctx, GOST28147_BLOCK_SIZE)),
+ .encrypt = _cfb_encrypt,
+ .decrypt = _cfb_decrypt,
+ .set_encrypt_key = _gost28147_set_key_tc26z,
+ .set_decrypt_key = _gost28147_set_key_tc26z,
+ },
+ {
+ .algo = GNUTLS_CIPHER_GOST28147_CPA_CFB,
+ .block_size = GOST28147_BLOCK_SIZE,
+ .key_size = GOST28147_KEY_SIZE,
+ .encrypt_block = (nettle_cipher_func*)gost28147_encrypt_for_cfb,
+ .decrypt_block = (nettle_cipher_func*)gost28147_encrypt_for_cfb,
+
+ .ctx_size = sizeof(struct CFB_CTX(struct gost28147_ctx, GOST28147_BLOCK_SIZE)),
+ .encrypt = _cfb_encrypt,
+ .decrypt = _cfb_decrypt,
+ .set_encrypt_key = _gost28147_set_key_cpa,
+ .set_decrypt_key = _gost28147_set_key_cpa,
+ },
+ {
+ .algo = GNUTLS_CIPHER_GOST28147_CPB_CFB,
+ .block_size = GOST28147_BLOCK_SIZE,
+ .key_size = GOST28147_KEY_SIZE,
+ .encrypt_block = (nettle_cipher_func*)gost28147_encrypt_for_cfb,
+ .decrypt_block = (nettle_cipher_func*)gost28147_encrypt_for_cfb,
+
+ .ctx_size = sizeof(struct CFB_CTX(struct gost28147_ctx, GOST28147_BLOCK_SIZE)),
+ .encrypt = _cfb_encrypt,
+ .decrypt = _cfb_decrypt,
+ .set_encrypt_key = _gost28147_set_key_cpb,
+ .set_decrypt_key = _gost28147_set_key_cpb,
+ },
+ {
+ .algo = GNUTLS_CIPHER_GOST28147_CPC_CFB,
+ .block_size = GOST28147_BLOCK_SIZE,
+ .key_size = GOST28147_KEY_SIZE,
+ .encrypt_block = (nettle_cipher_func*)gost28147_encrypt_for_cfb,
+ .decrypt_block = (nettle_cipher_func*)gost28147_encrypt_for_cfb,
+
+ .ctx_size = sizeof(struct CFB_CTX(struct gost28147_ctx, GOST28147_BLOCK_SIZE)),
+ .encrypt = _cfb_encrypt,
+ .decrypt = _cfb_decrypt,
+ .set_encrypt_key = _gost28147_set_key_cpc,
+ .set_decrypt_key = _gost28147_set_key_cpc,
+ },
+ {
+ .algo = GNUTLS_CIPHER_GOST28147_CPD_CFB,
+ .block_size = GOST28147_BLOCK_SIZE,
+ .key_size = GOST28147_KEY_SIZE,
+ .encrypt_block = (nettle_cipher_func*)gost28147_encrypt_for_cfb,
+ .decrypt_block = (nettle_cipher_func*)gost28147_encrypt_for_cfb,
+
+ .ctx_size = sizeof(struct CFB_CTX(struct gost28147_ctx, GOST28147_BLOCK_SIZE)),
+ .encrypt = _cfb_encrypt,
+ .decrypt = _cfb_decrypt,
+ .set_encrypt_key = _gost28147_set_key_cpd,
+ .set_decrypt_key = _gost28147_set_key_cpd,
+ },
+#endif
};
static int wrap_nettle_cipher_exists(gnutls_cipher_algorithm_t algo)
diff --git a/lib/nettle/gost/bignum-le.c b/lib/nettle/gost/bignum-le.c
new file mode 100644
index 0000000000..686aa32d5d
--- /dev/null
+++ b/lib/nettle/gost/bignum-le.c
@@ -0,0 +1,78 @@
+/* bignum.c
+
+ Bignum operations that are missing from gmp.
+
+ Copyright (C) 2001 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include <string.h>
+
+#include <nettle/bignum.h>
+#include "bignum-le.h"
+
+void
+nettle_mpz_get_str_256_u_le(size_t length, uint8_t *s, const mpz_t x)
+{
+ if (!length)
+ {
+ /* x must be zero */
+ assert(!mpz_sgn(x));
+ return;
+ }
+
+ size_t count;
+
+ assert(nettle_mpz_sizeinbase_256_u(x) <= length);
+ mpz_export(s, &count, -1, 1, 0, 0, x);
+ memset(s + count, 0, length - count);
+}
+
+#define nettle_mpz_from_octets_le(x, length, s) \
+ mpz_import((x), (length), -1, 1, 0, 0, (s))
+
+void
+nettle_mpz_set_str_256_u_le(mpz_t x,
+ size_t length, const uint8_t *s)
+{
+ nettle_mpz_from_octets_le(x, length, s);
+}
+
+void
+nettle_mpz_init_set_str_256_u_le(mpz_t x,
+ size_t length, const uint8_t *s)
+{
+ mpz_init(x);
+ nettle_mpz_from_octets_le(x, length, s);
+}
diff --git a/lib/nettle/gost/bignum-le.h b/lib/nettle/gost/bignum-le.h
new file mode 100644
index 0000000000..9ac3da81b5
--- /dev/null
+++ b/lib/nettle/gost/bignum-le.h
@@ -0,0 +1,71 @@
+/* bignum.h
+
+ Bignum operations that are missing from gmp.
+
+ Copyright (C) 2001 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#ifndef NETTLE_BIGNUM_LE_H_INCLUDED
+#define NETTLE_BIGNUM_LE_H_INCLUDED
+
+#include <nettle/nettle-meta.h>
+
+#include <nettle/nettle-types.h>
+
+#include <gmp.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define nettle_mpz_sizeinbase_256_u_le nettle_mpz_sizeinbase_256_u
+
+#define nettle_mpz_get_str_256_u_le _gnutls_mpz_get_str_256_u_le
+#define nettle_mpz_set_str_256_u_le _gnutls_mpz_set_str_256_u_le
+#define nettle_mpz_init_set_str_256_u_le _gnutls_mpz_init_set_str_256_u_le
+
+/* Writes an integer as length octets, using big endian byte order,
+ * and unsigned number format. */
+void
+nettle_mpz_get_str_256_u_le(size_t length, uint8_t *s, const mpz_t x);
+
+
+void
+nettle_mpz_set_str_256_u_le(mpz_t x,
+ size_t length, const uint8_t *s);
+
+void
+nettle_mpz_init_set_str_256_u_le(mpz_t x,
+ size_t length, const uint8_t *s);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NETTLE_BIGNUM_LE_H_INCLUDED */
diff --git a/lib/nettle/gost/ecc-gost-curve.h b/lib/nettle/gost/ecc-gost-curve.h
new file mode 100644
index 0000000000..0b55cec66d
--- /dev/null
+++ b/lib/nettle/gost/ecc-gost-curve.h
@@ -0,0 +1,61 @@
+/* ecc-gost-curve.h
+
+ Copyright (C) 2013 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */
+
+#ifndef NETTLE_ECC_GOST_CURVE_H_INCLUDED
+#define NETTLE_ECC_GOST_CURVE_H_INCLUDED
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The contents of this struct is internal. */
+struct ecc_curve;
+
+#ifndef NETTLE_PURE
+#ifdef __GNUC__
+#define NETTLE_PURE __attribute__((pure))
+#else
+#define NETTLE_PURE
+#endif
+#endif
+
+#define nettle_get_gost_256cpa _gnutls_get_gost_256cpa
+#define nettle_get_gost_512a _gnutls_get_gost_512a
+const struct ecc_curve * NETTLE_PURE nettle_get_gost_256cpa(void);
+const struct ecc_curve * NETTLE_PURE nettle_get_gost_512a(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NETTLE_ECC_GOST_CURVE_H_INCLUDED */
diff --git a/lib/nettle/gost/ecc-gost-hash.c b/lib/nettle/gost/ecc-gost-hash.c
new file mode 100644
index 0000000000..e5eb8d1b62
--- /dev/null
+++ b/lib/nettle/gost/ecc-gost-hash.c
@@ -0,0 +1,66 @@
+/* ecdsa-hash.c
+
+ Copyright (C) 2013 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include "ecc-internal.h"
+
+/* Convert hash value to an integer. If the digest is larger than
+ the ecc bit size, then we must truncate it and use the leftmost
+ bits. */
+
+/* NOTE: We don't considered the hash value to be secret, so it's ok
+ if the running time of this conversion depends on h.
+
+ Requires m->size + 1 limbs, the extra limb may be needed for
+ unusual limb sizes.
+*/
+
+void
+gost_hash (const struct ecc_modulo *m,
+ mp_limb_t *hp,
+ size_t length, const uint8_t *digest)
+{
+ if (length > ((size_t) m->bit_size + 7) / 8)
+ length = (m->bit_size + 7) / 8;
+
+ mpn_set_base256_le (hp, m->size + 1, digest, length);
+
+ if (8 * length > m->bit_size)
+ /* We got a few extra bits, at the low end. Discard them. */
+ mpn_rshift (hp, hp, m->size + 1, 8*length - m->bit_size);
+}
diff --git a/lib/nettle/gost/ecc-gost256cpa-32.h b/lib/nettle/gost/ecc-gost256cpa-32.h
new file mode 100644
index 0000000000..33d9fe41ae
--- /dev/null
+++ b/lib/nettle/gost/ecc-gost256cpa-32.h
@@ -0,0 +1,1071 @@
+/* For NULL. */
+#include <stddef.h>
+#define ECC_LIMB_SIZE 8
+#define ECC_PIPPENGER_K 11
+#define ECC_PIPPENGER_C 6
+static const mp_limb_t ecc_p[8] = {
+ 0xfffffd97UL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL,
+};
+static const mp_limb_t ecc_b[8] = {
+ 0xa6UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+};
+static const mp_limb_t ecc_q[8] = {
+ 0xb761b893UL, 0x45841b09UL, 0x995ad100UL, 0x6c611070UL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL,
+};
+static const mp_limb_t ecc_g[16] = {
+ 0x1UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x9e9f1e14UL, 0x22acc99cUL, 0xdf23e3b1UL, 0x35294f2dUL, 0x453f2b76UL, 0x27df505aUL, 0xe0989cdaUL, 0x8d91e471UL,
+};
+static const mp_limb_t ecc_Bmodp[8] = {
+ 0x269UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+};
+#define ECC_BMODP_SIZE 1
+static const mp_limb_t ecc_Bmodq[8] = {
+ 0x489e476dUL, 0xba7be4f6UL, 0x66a52effUL, 0x939eef8fUL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+};
+#define ECC_BMODQ_SIZE 4
+#define ecc_Bmodp_shifted ecc_Bmodp
+#define ecc_Bmodq_shifted ecc_Bmodq
+static const mp_limb_t ecc_pp1h[8] = {
+ 0xfffffeccUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0x7fffffffUL,
+};
+static const mp_limb_t ecc_qp1h[8] = {
+ 0xdbb0dc4aUL, 0x22c20d84UL, 0x4cad6880UL, 0xb6308838UL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0x7fffffffUL,
+};
+#define ecc_redc_ppm1 NULL
+#define ECC_REDC_SIZE 0
+#if USE_REDC
+#define ecc_unit ecc_Bmodp
+static const mp_limb_t ecc_table[4096] = {
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x269UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x4d82b411UL, 0x9271ea7aUL, 0xcd7fc5ecUL, 0x208fd58eUL, 0xe53fbfe6UL, 0x1938a990UL, 0x4fd209caUL, 0x349f9676UL,
+ 0x728711ccUL, 0x2bf67a05UL, 0x9fa7d47eUL, 0x76ed8b3bUL, 0x4cfb5354UL, 0x215fcb7aUL, 0x1d77b1a3UL, 0xcd2781d7UL,
+ 0x4d370488UL, 0x9a91dea9UL, 0xd22a568eUL, 0x23d14b45UL, 0x57ab7e3bUL, 0xb27f0331UL, 0x91bc69c8UL, 0x6c130a73UL,
+ 0x10a3e30aUL, 0x38716a21UL, 0x4143e9b7UL, 0xb3fec373UL, 0xef98c1d3UL, 0x1e856e03UL, 0xb7fcef5aUL, 0x50001284UL,
+ 0x5b8cc67bUL, 0xccf91cabUL, 0x2b34e17fUL, 0xada71d72UL, 0x9478dedcUL, 0xd37764faUL, 0x3194e2e7UL, 0xa81e89e5UL,
+ 0xe3e91a75UL, 0x118e2615UL, 0x89d423e4UL, 0xfca8412aUL, 0x8b3862d5UL, 0x97294ae7UL, 0x39f1c564UL, 0xb8c0af64UL,
+ 0x61a1097dUL, 0xdc5d9e11UL, 0x9fc2cb97UL, 0xa13cd3d6UL, 0xdae719b6UL, 0x6cef39fdUL, 0x610dccabUL, 0x8d8bc1d1UL,
+ 0x361f0595UL, 0x6e48523aUL, 0x6eb68ee4UL, 0x670ec034UL, 0xdc314120UL, 0x9eec9e6bUL, 0x8a688775UL, 0xde69cf78UL,
+ 0x9d332137UL, 0x2e511af7UL, 0xdcf09ca0UL, 0x406e861fUL, 0x180f0d9eUL, 0x2cdb4bb0UL, 0xf45ce549UL, 0x9cf943f5UL,
+ 0x8ae191ffUL, 0x67e51425UL, 0xf03dfddeUL, 0x6bd19217UL, 0x5bb405d9UL, 0x69afc180UL, 0x86b9c0e6UL, 0xe4a43fa9UL,
+ 0x85339ca0UL, 0xf1167f51UL, 0x29a59cafUL, 0x2c399948UL, 0xe4970522UL, 0x220adb90UL, 0xda5cd9e9UL, 0x52ebab4bUL,
+ 0x3a43e2e6UL, 0x25664db6UL, 0xb80668deUL, 0xb6b22958UL, 0xe6b7dedUL, 0x404ee673UL, 0x845317f1UL, 0x2ee7630cUL,
+ 0xf4d39181UL, 0x47886e8eUL, 0x244eae3eUL, 0x4dc741d3UL, 0x953bf381UL, 0x630ae501UL, 0x5f534880UL, 0x66685f2eUL,
+ 0xf090c066UL, 0x1ad07a2cUL, 0xf9ea65abUL, 0x7fa9a256UL, 0x3d57186dUL, 0x2ab27ff9UL, 0x164d727eUL, 0xdadbd78dUL,
+ 0xb5f2ed49UL, 0xca46effdUL, 0xed472a4fUL, 0x57ccd31aUL, 0x3627d5e3UL, 0x948c0a8eUL, 0xf8217340UL, 0x8ecc58d0UL,
+ 0x9fd8fe8eUL, 0xf9ef27ceUL, 0x17b18e43UL, 0x5a10eed2UL, 0xce192e1aUL, 0xcd576050UL, 0xa1ce977dUL, 0xe18fabf2UL,
+ 0xba1c5537UL, 0x1e57872UL, 0xe952cffaUL, 0x2e44ed16UL, 0xd941ee1dUL, 0xe656b197UL, 0xb871cef1UL, 0x7e4c31e6UL,
+ 0x39bde1f1UL, 0xf06d9aa9UL, 0x28412a0fUL, 0x444526c5UL, 0x5ea5418UL, 0xfa0481adUL, 0x4657d686UL, 0xef29d5d9UL,
+ 0x658b29a8UL, 0x2ddb0d46UL, 0x346bc48dUL, 0x8df06eaaUL, 0x9cdbf831UL, 0x32cc9787UL, 0x94625f7aUL, 0xae091f02UL,
+ 0x2015a836UL, 0x250a175eUL, 0x7087271dUL, 0x2e3fac7bUL, 0x20a58520UL, 0xf9832676UL, 0x8690da3dUL, 0xbc26dfafUL,
+ 0x5ecd84fdUL, 0x1610fe04UL, 0xeb63b248UL, 0x2e9024ebUL, 0x7d3ff71eUL, 0x200cd262UL, 0x97017e79UL, 0x7f774758UL,
+ 0xdc5ba08cUL, 0x942a28a7UL, 0x1fc8e2faUL, 0xe21dbb71UL, 0xac117881UL, 0x38d01e75UL, 0x5bf01f6cUL, 0xcd493d09UL,
+ 0xb806248eUL, 0x3a01b011UL, 0x4dab6535UL, 0xffb18128UL, 0x7f9ba8dbUL, 0xe5bdb9eeUL, 0xe1054129UL, 0x699680bUL,
+ 0xe5331d9bUL, 0xcc181b75UL, 0xf85a9fddUL, 0xc711a68fUL, 0x1bc7188UL, 0x23b5711cUL, 0xfe73dce0UL, 0x1a07b3adUL,
+ 0xabaf5878UL, 0x7f34257fUL, 0x8d9d5a09UL, 0x14e56d42UL, 0x79b20e74UL, 0x9f9b33c3UL, 0xbed0b30cUL, 0xb1865ed8UL,
+ 0x456f4b19UL, 0xe9cb187bUL, 0xaaf26c8eUL, 0x6fe8dc92UL, 0x56f0b914UL, 0x451a6362UL, 0xdfed5e14UL, 0x3d0a8861UL,
+ 0x192b28faUL, 0xf3e02527UL, 0xa40b1e85UL, 0x6c44b09dUL, 0x16da6101UL, 0x72369857UL, 0x2b6b991dUL, 0x5de340beUL,
+ 0x98e0b4d9UL, 0x407dca16UL, 0xc351a1d3UL, 0xf8e65953UL, 0xe65cfe2UL, 0x54ce60faUL, 0xf3a50f67UL, 0xa74aa64aUL,
+ 0x660e79acUL, 0xab330f4cUL, 0xc0b53240UL, 0xe0294d8aUL, 0x4cdc5352UL, 0xeaee8e0UL, 0x849cc804UL, 0xf22c62e6UL,
+ 0xf7ac4a2UL, 0xd0f26fb2UL, 0xee6ee9b2UL, 0xc390cbd9UL, 0xe0d08be3UL, 0x7fa9f053UL, 0x4987d9a4UL, 0xf2e59e43UL,
+ 0x2f8d72b9UL, 0x3028051fUL, 0xc3feb20fUL, 0xf085842aUL, 0xc909ff85UL, 0x14f2ac6eUL, 0x5d876f76UL, 0xbf23f055UL,
+ 0x7ba388f6UL, 0xa4800ae8UL, 0x7ca568aUL, 0xa46d48e0UL, 0x3e6a244fUL, 0xbcf58410UL, 0xb80c6195UL, 0xb110a240UL,
+ 0x95f8cc0UL, 0x13e275beUL, 0x3c9e52d6UL, 0xace28be3UL, 0xdec582bUL, 0x9765dd4fUL, 0x745a2beeUL, 0xe2cae5efUL,
+ 0x60e50aa5UL, 0x76ca6673UL, 0x40aa6b5cUL, 0x2649e8fcUL, 0x76bca9beUL, 0x6ac4a7d1UL, 0xbfa74036UL, 0xc405bcdUL,
+ 0x588fdc25UL, 0x2ab1d80bUL, 0xba90d19fUL, 0x429e0579UL, 0x5e7577a7UL, 0xadedba7fUL, 0xa048f3c5UL, 0xdf0da4e3UL,
+ 0x4d6c2cd8UL, 0xb9d5b41cUL, 0xf23a0223UL, 0x1421d1f5UL, 0xe2abaf6UL, 0x6e8ebd10UL, 0xc8647411UL, 0x5b9ae22aUL,
+ 0xa38f3071UL, 0x983c8368UL, 0x5b2bbee8UL, 0x233fbf69UL, 0xca0335e3UL, 0x17d934f7UL, 0xc06743f4UL, 0x7565983cUL,
+ 0x6314a24dUL, 0x646af82eUL, 0x11cfb7e4UL, 0xb9b00eefUL, 0x2a042843UL, 0xfc21c717UL, 0xaec0733UL, 0x312cc940UL,
+ 0x3a1f52e5UL, 0x264bbdfdUL, 0x567f8c84UL, 0x35785259UL, 0xaf644aaeUL, 0x776bc00eUL, 0x1d4eddaaUL, 0x1d26554fUL,
+ 0x56840d1dUL, 0x890ec953UL, 0xa7200d3bUL, 0x9a022c3UL, 0x3118b696UL, 0x36d44231UL, 0x7267d2ceUL, 0xf8f5d22fUL,
+ 0x3915375UL, 0x2b8ebec0UL, 0xd486b5f8UL, 0xd6e12a60UL, 0x580f679UL, 0x574567deUL, 0x6467220aUL, 0x65ddb7d5UL,
+ 0x3939af9eUL, 0xc2c320ebUL, 0x99394292UL, 0xdb315e6aUL, 0xa113dfc1UL, 0x437bfbafUL, 0xcb9e34faUL, 0xd0133206UL,
+ 0x624135eaUL, 0xd57a3a7eUL, 0x33c317e5UL, 0xa027f66dUL, 0xaa565f0UL, 0x711d7d8eUL, 0x54a7fa07UL, 0x42f4637cUL,
+ 0x82f0d659UL, 0x49a8896eUL, 0x71f18a21UL, 0x21d6976cUL, 0x33593204UL, 0xb1e33a7bUL, 0x7e1bacffUL, 0x23ed8b16UL,
+ 0x996f17bdUL, 0xf4a17bbfUL, 0x73176ea4UL, 0x6d660c74UL, 0xc1f301a9UL, 0x1fc7363cUL, 0x1aeb1cacUL, 0xd64c1ea1UL,
+ 0x19a7b7d1UL, 0x7a10b454UL, 0xabc1089aUL, 0x33010367UL, 0x54f7585fUL, 0xd05fbd2UL, 0x2314e4dUL, 0x5d6cdd22UL,
+ 0xf5be2b44UL, 0x5a6090a4UL, 0x3bdf0f7aUL, 0xc59e3418UL, 0xe016972aUL, 0xfc6633a5UL, 0x1093cff1UL, 0x8d60a1b5UL,
+ 0xf3ae8e88UL, 0x169f5b89UL, 0x4d17e77eUL, 0x271eec07UL, 0x2bb1d8a2UL, 0xad679646UL, 0x95fd7b64UL, 0xebeb80cUL,
+ 0xfa36bf48UL, 0xabbbd5bcUL, 0x9ec958ceUL, 0x2b5d0778UL, 0x6803e501UL, 0xdb1f82c5UL, 0xee268faeUL, 0x5bad5c2bUL,
+ 0x596f90c1UL, 0x212232ecUL, 0x43e00b35UL, 0x69784674UL, 0x1be7ed60UL, 0x3c7da935UL, 0x46f20e66UL, 0x9ca00a1dUL,
+ 0x443410f6UL, 0xbdbfe58eUL, 0xedcfbfd9UL, 0xc063e88cUL, 0x6637501dUL, 0x9bc60262UL, 0xfada5d51UL, 0x29812e11UL,
+ 0x2098f86bUL, 0xa9210e1fUL, 0x72c513bbUL, 0x1ac88797UL, 0x958390bUL, 0x9fce8de8UL, 0x5d430ba4UL, 0x74010dfbUL,
+ 0x975c8121UL, 0xd3cb573cUL, 0x92ac3fcbUL, 0x9ea66989UL, 0x7fbf52aaUL, 0xe7022fdcUL, 0x948e46b5UL, 0x6eda69b2UL,
+ 0xa504ef6bUL, 0x8fb94d4cUL, 0xf5b017f1UL, 0xfe2944b4UL, 0xa16d10fUL, 0x7a370f32UL, 0x4ce512e0UL, 0x5bcbc4a1UL,
+ 0x3350304aUL, 0x27a4de87UL, 0x51c7f8d8UL, 0x40861f3cUL, 0xc6aa00e1UL, 0xaca17208UL, 0xf7837dcfUL, 0x5df902e3UL,
+ 0xf3aae99dUL, 0x6d5b679UL, 0xe367f377UL, 0x336e1cfUL, 0xb7de4d64UL, 0xdb7b9bd7UL, 0x48d4da0dUL, 0xe88a4c9fUL,
+ 0x3ad847d5UL, 0x793c120dUL, 0x814049d6UL, 0x5236130UL, 0x9ed7a755UL, 0xb4e67360UL, 0xd3ee2b76UL, 0xc473137eUL,
+ 0xf0ed5a00UL, 0x5abf387fUL, 0x82649336UL, 0x14918656UL, 0x57514911UL, 0x26238d56UL, 0x410f3e86UL, 0xc4bc7e13UL,
+ 0x41f25a81UL, 0xf4ea8b94UL, 0xd608bdb4UL, 0x2ce3f801UL, 0xd00ad1b7UL, 0x31865e0bUL, 0x5202e234UL, 0x2f1144f0UL,
+ 0x36e5f242UL, 0xb8e0a332UL, 0xb0c07619UL, 0xf962e100UL, 0x54ecb1e1UL, 0x3a289a80UL, 0x86688f9fUL, 0x2871e764UL,
+ 0xd1e31b99UL, 0x13d4767bUL, 0x5c89cb7cUL, 0xf8adfc0eUL, 0x82519714UL, 0xfa7b276UL, 0x3f1c1360UL, 0x389cbed1UL,
+ 0x76b8c9bdUL, 0x4c65f976UL, 0xaadb6e6eUL, 0x2dbfc4d5UL, 0xe30d1f5bUL, 0xe5643b3aUL, 0x459deab9UL, 0xad7577dUL,
+ 0x8fc2d7fUL, 0x10ac7e9eUL, 0xdd8ed8d6UL, 0x53aa93b9UL, 0xc9d2398eUL, 0x5930c396UL, 0x6c90cf02UL, 0x6a1d27e1UL,
+ 0x57accd02UL, 0xa1f3e69fUL, 0xb403bd29UL, 0xdfad27c9UL, 0x8ee91a95UL, 0x91b03c25UL, 0x8c1ee669UL, 0xa89db749UL,
+ 0x5b674f01UL, 0xab448a18UL, 0xffcacfa2UL, 0xcdf04197UL, 0xf79694caUL, 0x543996c7UL, 0xebfc347bUL, 0xcfedab0cUL,
+ 0x7f9855f3UL, 0xb712809eUL, 0xb592cd9bUL, 0x80ff8036UL, 0x267599adUL, 0x6a692f32UL, 0x4a15b3e6UL, 0x663320a4UL,
+ 0x208f854bUL, 0x43841149UL, 0x327269dfUL, 0xa98a0ee4UL, 0xe85b3aa3UL, 0x4113211aUL, 0x6ba93ed7UL, 0x4ed8e6f7UL,
+ 0xa1801a18UL, 0xb59f6e5UL, 0xb47ea2b4UL, 0x26017587UL, 0x39876468UL, 0x3b273de2UL, 0x64ceb9d2UL, 0xdacdb053UL,
+ 0xf86c93a0UL, 0x6eeb71ceUL, 0x15d4c51UL, 0x55fdffa4UL, 0x34de500cUL, 0x303e8249UL, 0x62911a41UL, 0xde8bf014UL,
+ 0x98f93f1aUL, 0xffd2bbe1UL, 0x5e3b63eaUL, 0xcdacf905UL, 0xc885a310UL, 0x917ef59dUL, 0x6d8d2bc1UL, 0xb46f86b6UL,
+ 0xab03b344UL, 0x8937bd6aUL, 0xd66f51dcUL, 0xfea838dUL, 0xc12475afUL, 0x823dcd1dUL, 0x7a8c8db1UL, 0xb81d6cc4UL,
+ 0xf5b48650UL, 0xf03afe9fUL, 0xdf5e2a63UL, 0xe051800eUL, 0x856fe615UL, 0x3a20c21UL, 0x505bb8d1UL, 0x6b43fbe0UL,
+ 0x75fe00f0UL, 0x59380a28UL, 0x9e2ad555UL, 0x24a8e6e2UL, 0xb54e2b8fUL, 0xc5846725UL, 0xe12ed89aUL, 0xe824b8bfUL,
+ 0x3e1802c1UL, 0x14767aecUL, 0xf7dd8eefUL, 0xca384097UL, 0xe89ed164UL, 0x35f9f188UL, 0x3d5dea4dUL, 0x426e51b2UL,
+ 0x31fe7bUL, 0xd2ae6f16UL, 0xbde6d329UL, 0x8a678694UL, 0xca30bfeaUL, 0x482d533UL, 0x5645dc5eUL, 0x966b23b1UL,
+ 0x7141d85dUL, 0xddddce21UL, 0x61a01285UL, 0x28f9584cUL, 0x2d18de6aUL, 0x6d1ef923UL, 0x93eb7e69UL, 0xc27800bdUL,
+ 0x9ce2ee9UL, 0x13aead11UL, 0xaf9cdc33UL, 0x9bd1deddUL, 0xa0fbe620UL, 0xf300b32dUL, 0x97fd23cbUL, 0x2a7235bfUL,
+ 0x241838d4UL, 0x9f590135UL, 0xf5aa1315UL, 0xcb767b59UL, 0x4cba6db8UL, 0x50fdb0e2UL, 0xe4fa6ed5UL, 0xd303a00UL,
+ 0xa6735629UL, 0x12124b5fUL, 0x80621d43UL, 0xf57f1c60UL, 0x97e3d405UL, 0x498f3655UL, 0xd0c473aUL, 0x4198a088UL,
+ 0x5b613c9cUL, 0x41f92d9fUL, 0x368a3021UL, 0x591f9ea7UL, 0x90f5233cUL, 0x34c459afUL, 0x10e0f8bbUL, 0x470f0e44UL,
+ 0x14325578UL, 0x467afddaUL, 0xc1890886UL, 0xea95ad39UL, 0xe729e076UL, 0x6a7dd15UL, 0x7339650bUL, 0xaac20917UL,
+ 0x44a83c63UL, 0x396fe67bUL, 0x2dda4e65UL, 0x92bb09afUL, 0x7728d3c3UL, 0xb1bc3afbUL, 0xff4b2e5aUL, 0x6007a0fdUL,
+ 0x35b7be8bUL, 0xdf83c04UL, 0x93bc97c5UL, 0x472e05c3UL, 0x52b40ad1UL, 0xa54d861eUL, 0x866e2c0bUL, 0xe263a27eUL,
+ 0xb657322cUL, 0x2bafbe29UL, 0x884a70a3UL, 0x143d4706UL, 0xea7ee0aeUL, 0xa816e2e1UL, 0x18aa357dUL, 0x6315365cUL,
+ 0x99cc35a0UL, 0x13906a3bUL, 0x71b81dceUL, 0xfabc8978UL, 0xfaedfa64UL, 0x876b9a6UL, 0x8f0d63adUL, 0x6a68e468UL,
+ 0xb403e429UL, 0x4a2b0048UL, 0xc6150ecdUL, 0x2e0935b5UL, 0x7debd05eUL, 0xbdf6c83cUL, 0x52d9d52fUL, 0x435abcebUL,
+ 0xfafd9df1UL, 0x92447341UL, 0x3a536dbbUL, 0xfc997ab5UL, 0x3d0efcb5UL, 0x699d8f0dUL, 0xe448e005UL, 0x274074b6UL,
+ 0xf297004eUL, 0x3aa71004UL, 0x179c9df8UL, 0x419be67bUL, 0xc8285fd9UL, 0xdeb43366UL, 0xcc2eb843UL, 0xbfa1c616UL,
+ 0x98eacf45UL, 0x6b055350UL, 0xb9418315UL, 0x3e093c5dUL, 0x78d31971UL, 0xd2835674UL, 0xba446884UL, 0x7ba8043aUL,
+ 0xbc4fee0eUL, 0x300c0243UL, 0x6c6fe657UL, 0x30fdcf8aUL, 0x4d3635c6UL, 0x928da0d0UL, 0xe2d506edUL, 0x14aad129UL,
+ 0xfc50d416UL, 0x95b64457UL, 0x39708fa7UL, 0xb60952acUL, 0xd71b560fUL, 0x602dc88bUL, 0x2ec7eae0UL, 0xef586062UL,
+ 0x9c2a7cc8UL, 0x87f880d2UL, 0xdd460972UL, 0xd3073f4eUL, 0x416f46c5UL, 0xe82fc8d2UL, 0x932e63fbUL, 0xe614fa0eUL,
+ 0x85a3c495UL, 0x18469eaaUL, 0x7f5f89f6UL, 0x65dcf1f5UL, 0x4889192aUL, 0x51fc5286UL, 0x24ef546cUL, 0xce313470UL,
+ 0x8ace1d03UL, 0x667b04acUL, 0x892a3b23UL, 0xe3821445UL, 0x406d4316UL, 0x813c8cf5UL, 0x5bfd2a74UL, 0x8e168bfdUL,
+ 0x4df44ce9UL, 0x302a4267UL, 0x8cdc9a39UL, 0x44acf5e2UL, 0xb6aae8bUL, 0xc43e314dUL, 0x7cdcb9f5UL, 0xd40fc234UL,
+ 0x2d8ccd6fUL, 0xc42a0f62UL, 0xb452f554UL, 0xfa89c396UL, 0x56a0dcdbUL, 0xc1d3eda6UL, 0x748c4570UL, 0x6c28b299UL,
+ 0x431f9da8UL, 0x220d85cdUL, 0xd8e986f7UL, 0x7137865bUL, 0xfdcf73cfUL, 0x40f4816fUL, 0xa94e3e89UL, 0x27ec5aabUL,
+ 0x6b5c6ccUL, 0x132a0bb7UL, 0x8250c5efUL, 0x5d5b13b9UL, 0xb819a95bUL, 0xbcc299e2UL, 0xf10d30daUL, 0xc29bfe4fUL,
+ 0x4d45742bUL, 0x323adbdaUL, 0xd0e19ef7UL, 0x1dc21f96UL, 0xad440048UL, 0xf81749bcUL, 0x62406daeUL, 0xc99fc7acUL,
+ 0x698785cUL, 0x469bfc9cUL, 0xa2a19476UL, 0x1b965adbUL, 0xc35cc9c1UL, 0x44037736UL, 0x4a3f2a8eUL, 0x350c8cd5UL,
+ 0x34089944UL, 0xf77a8ccUL, 0xb5087a61UL, 0xe1d77cdfUL, 0x3aac726fUL, 0x97b97478UL, 0x5bdf1a1fUL, 0x96ca8701UL,
+ 0x1df718d3UL, 0xdf7eff6cUL, 0xcca715efUL, 0x59dbb1a5UL, 0xe0d88785UL, 0x8f7109c8UL, 0x33c9d8fbUL, 0x921927efUL,
+ 0xa53a1721UL, 0xa1ef0a50UL, 0x40f6d98aUL, 0x33b32fbfUL, 0x8b41dffaUL, 0x75409c5UL, 0x497d5d6eUL, 0xd7c6839fUL,
+ 0x795ec55cUL, 0xdadac1acUL, 0x393daa4eUL, 0x4aeac5cbUL, 0x9405b4caUL, 0xb2242fb8UL, 0xe1f9985bUL, 0x64aa521bUL,
+ 0x92bb1ca9UL, 0x765ea8edUL, 0x3f777985UL, 0x156d9786UL, 0x438523fcUL, 0xdeab8be3UL, 0x529c49c3UL, 0x91a320eeUL,
+ 0xe60c8336UL, 0x504d3c6fUL, 0xd6a9bd5cUL, 0x5f026f03UL, 0x6223af2cUL, 0x91bbc86dUL, 0x93db3f24UL, 0x30dbe84dUL,
+ 0x4645ca83UL, 0x52ae46e3UL, 0x5f096586UL, 0x42e0f6faUL, 0x7e7f21c2UL, 0xd10150d1UL, 0xf25f18b1UL, 0x72c6d74eUL,
+ 0xcfe500cfUL, 0xdc17532dUL, 0xcfe854c0UL, 0xe0308654UL, 0xba634e2aUL, 0x202983dfUL, 0x643dbdcdUL, 0x92fe3b36UL,
+ 0x340f6787UL, 0x8ce45f20UL, 0x75d645a8UL, 0x68de5855UL, 0x8e8b3d41UL, 0xcb9a74fdUL, 0x32be0a2fUL, 0x57da11abUL,
+ 0xb9c4ab8aUL, 0x991a7283UL, 0x55856053UL, 0xbf5700c3UL, 0xa072aa0dUL, 0xed006142UL, 0xdc4f693fUL, 0xc4a469e0UL,
+ 0xedbb4607UL, 0xeb16bd21UL, 0xf5754b09UL, 0xe2508329UL, 0x1c358f47UL, 0xe2e97d4UL, 0x3e90babcUL, 0x9506e5fUL,
+ 0x53e829bdUL, 0xc17f446fUL, 0x6a4532a0UL, 0x5382c487UL, 0x34bc2dbUL, 0x6f6d2731UL, 0xe0fd57baUL, 0x74c5510fUL,
+ 0x90b8225aUL, 0x8bbd6758UL, 0xc6b4150bUL, 0x16477d0bUL, 0xa664d93bUL, 0x320e61b0UL, 0x77b6c1a0UL, 0x622631b6UL,
+ 0x50419c7bUL, 0x36a545a0UL, 0x572af62aUL, 0x1c5f7138UL, 0xd5958b1bUL, 0xddc58702UL, 0x922173d6UL, 0x48dbc853UL,
+ 0x59c547faUL, 0x274259abUL, 0x4d7c082eUL, 0x36c7bbUL, 0x6865fb81UL, 0xaf4fec4bUL, 0x5a8f3334UL, 0xa43d3d05UL,
+ 0xb838f66fUL, 0x706796aeUL, 0x4a431bc9UL, 0xa7d4a128UL, 0x2f716f7cUL, 0xf4a699c6UL, 0x1d6e65e7UL, 0x16e75968UL,
+ 0x87918adeUL, 0x95ee836cUL, 0xf360924aUL, 0x4ca10d3aUL, 0xf81e0543UL, 0xc83d271eUL, 0x71837cb1UL, 0x696beeeeUL,
+ 0x6039a17eUL, 0x7d1a6de3UL, 0xebc7a2e3UL, 0xb725333fUL, 0xc304fc01UL, 0xae882bcbUL, 0x2afee5c2UL, 0x668250d3UL,
+ 0x996b260fUL, 0xf2333250UL, 0xcebe700aUL, 0xa2495ea1UL, 0xb8ca6b55UL, 0xd1fc886eUL, 0xb725cc4dUL, 0xbd0f5945UL,
+ 0x6361b0e8UL, 0x7e68715eUL, 0xc4ad881dUL, 0xfb608259UL, 0x72218777UL, 0x747c9ac5UL, 0x644154a3UL, 0xf4e63189UL,
+ 0x678b3a76UL, 0x823d6fc6UL, 0x51884089UL, 0xb44aaf37UL, 0x68277d59UL, 0x440a585aUL, 0xe3ba604fUL, 0x79b998d7UL,
+ 0x14bd3368UL, 0xe7861b9aUL, 0x97295379UL, 0x389c11cbUL, 0xa063ff84UL, 0xffddb286UL, 0x2443afa6UL, 0xdf2678c0UL,
+ 0x62cde45bUL, 0x79a38464UL, 0x190e265UL, 0x3dcb11e8UL, 0x3584f403UL, 0x8906e94eUL, 0x557a4c83UL, 0x4fa4742cUL,
+ 0xde5abf7UL, 0x15ce538aUL, 0x8e7a249cUL, 0x39e4b5e6UL, 0x6972b798UL, 0xe4e58131UL, 0xb608af45UL, 0xb8bad384UL,
+ 0x606e8c79UL, 0xb035ccfcUL, 0x18d0755aUL, 0x660eaec7UL, 0xc8a7572eUL, 0xd91757afUL, 0x36ca27d6UL, 0xf76b1619UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x65b81454UL, 0x984b71e9UL, 0xfe9c944bUL, 0x4aa2b12aUL, 0x13a7e526UL, 0x923ff592UL, 0xbdd6541aUL, 0x5868980eUL,
+ 0xd64bbc26UL, 0xea0bd455UL, 0xdf1a1d5fUL, 0x512ef2d2UL, 0x6d80caadUL, 0xed589cb0UL, 0x2a5e1741UL, 0x8e04cba5UL,
+ 0x3cd07c04UL, 0x30065b7aUL, 0x3e4c7fdeUL, 0xcac5d8b5UL, 0xd1eb3f0cUL, 0xe213d821UL, 0x4746d555UL, 0xaba9ac7UL,
+ 0x4d5f1a99UL, 0x1fd06eaeUL, 0xa0c7e17aUL, 0xf8bf8d65UL, 0xcacb9489UL, 0xc5cad66fUL, 0x31846ccfUL, 0x7cfc07bdUL,
+ 0xcd59c9adUL, 0x6480ee9dUL, 0x41e45410UL, 0xabf23102UL, 0xab08872UL, 0x956a7087UL, 0x7c17b3edUL, 0x9d39f4ceUL,
+ 0x152e2e78UL, 0x38554651UL, 0x8427b590UL, 0x1a46ba49UL, 0xd7380cedUL, 0xb17e03b2UL, 0xed02b3f2UL, 0xb645f815UL,
+ 0x44a08f8bUL, 0xfaecee26UL, 0x7e781f83UL, 0x929d9850UL, 0x3561e9aUL, 0xf085bb48UL, 0xe2fa2609UL, 0x97810a87UL,
+ 0xda75a45aUL, 0x9fc4645UL, 0xa3a4ff4eUL, 0x1af4b481UL, 0xd4685d0UL, 0x9bd55064UL, 0x7629fb8UL, 0xff4395e4UL,
+ 0x26e27f90UL, 0x5a530544UL, 0xf5e0d0cbUL, 0x476f5803UL, 0xb276caa8UL, 0x33a185e6UL, 0x85a9e4bdUL, 0xe37aa839UL,
+ 0x9d2b8a43UL, 0xe1840c8dUL, 0x64775c18UL, 0xa7c05702UL, 0x588a3ad0UL, 0xdab4e422UL, 0xfd81d9b9UL, 0x3432b5d3UL,
+ 0xccbf6f50UL, 0x4956e7f2UL, 0xea7c8c7fUL, 0x42bbf514UL, 0xb6213df5UL, 0xec1383f0UL, 0x162dc239UL, 0x9a1f8674UL,
+ 0xf221e2c9UL, 0x318d60d0UL, 0xd2103aa1UL, 0xe1366cafUL, 0x5087d1ccUL, 0xb25bd04dUL, 0xf50a805dUL, 0xe5f82334UL,
+ 0xc35d5becUL, 0x3b283f30UL, 0x7b546ceeUL, 0x77c2c01UL, 0xd3e9f290UL, 0x4b7869bbUL, 0x55ca3c0eUL, 0x94d48151UL,
+ 0x48fe695eUL, 0x2e9df9a9UL, 0x1bb4607UL, 0x6d403e8dUL, 0xd2a3af7aUL, 0xd90e419dUL, 0xd070a0f7UL, 0x4bf0d936UL,
+ 0x51125ce5UL, 0x47c10116UL, 0x44247201UL, 0xb533e39aUL, 0x8a8d533aUL, 0x3617e73bUL, 0xb07cc26dUL, 0x44ccc48dUL,
+ 0x80369fc8UL, 0x283da6bbUL, 0xe8c5e904UL, 0x49cbc8eaUL, 0x1a027dfUL, 0x8a8085d3UL, 0xe00b7614UL, 0x4128cd8cUL,
+ 0xe3a7d512UL, 0xa1bdb9b2UL, 0x72e5832bUL, 0x78060606UL, 0x4b6a3918UL, 0xc7a9cf42UL, 0x9d3be92eUL, 0x6fb76243UL,
+ 0xb0f6012eUL, 0x6b9180abUL, 0x47478f0cUL, 0x9ea7c07cUL, 0x21aa54caUL, 0x9f4fed07UL, 0x750ba0d7UL, 0x3ea2fea7UL,
+ 0x276af083UL, 0x87656b1dUL, 0x1f32c02fUL, 0xdfbd4d88UL, 0x5029c1b6UL, 0x8d1917d4UL, 0x9e000b63UL, 0x4cb05ec3UL,
+ 0x389de1fbUL, 0xdf8702e1UL, 0xf3ed6899UL, 0xe3418960UL, 0x55cf778bUL, 0x7ab00bfbUL, 0xea97b951UL, 0xeef967UL,
+ 0x16d87b75UL, 0xeb138bcdUL, 0x4669c989UL, 0xdcdb296eUL, 0x4014ec35UL, 0xa7b1bc70UL, 0xe135fb46UL, 0xe6427316UL,
+ 0x86ab5664UL, 0xcfb152e4UL, 0x16ffa417UL, 0x51fc1bcaUL, 0xec560181UL, 0xac6574beUL, 0xb7bbb763UL, 0x1f0152eaUL,
+ 0x5b62f251UL, 0x6df5e220UL, 0x6c7de46UL, 0x1de86f72UL, 0xa5a7b0dUL, 0x484fb49dUL, 0xd5c7e090UL, 0x62c16124UL,
+ 0x86578271UL, 0xbe9b9f98UL, 0xf7653ffcUL, 0xc1431c1bUL, 0x2d44bb56UL, 0xf2a95f60UL, 0x541588aeUL, 0x36ab6fcaUL,
+ 0x1a7e0974UL, 0x5c3442eaUL, 0xf7bc81d2UL, 0xa89552bbUL, 0x69c9ee04UL, 0x3bd482baUL, 0x84afcfcaUL, 0x74cf2b81UL,
+ 0xb0d426aUL, 0xe8ccf707UL, 0xa10a9589UL, 0x770705d6UL, 0xd4d38532UL, 0x157e9160UL, 0x2b99daa3UL, 0xca1721fcUL,
+ 0xef8836fcUL, 0x943fe382UL, 0x1b49a79cUL, 0x30d9f49fUL, 0xc4199a14UL, 0xc2eb175fUL, 0x81ccecbaUL, 0xb8ad1924UL,
+ 0x9a61722aUL, 0x22c9c960UL, 0x728c3e46UL, 0x3e58309fUL, 0x4ef4be5aUL, 0x57dce94bUL, 0x869107d1UL, 0xda9fccaUL,
+ 0x475702f9UL, 0x578b0640UL, 0xa5a6098eUL, 0x33e1abddUL, 0x6b8b75c1UL, 0xe34b0fd3UL, 0x562a81b1UL, 0xe172a16eUL,
+ 0xd8fe0465UL, 0x8b8bf462UL, 0x5a63cd9cUL, 0x812b8e8fUL, 0xb0a18fb0UL, 0xffa01a59UL, 0x4c2cb21bUL, 0x5aaf11fUL,
+ 0xd8d23658UL, 0x3c7942e6UL, 0xb77b4cefUL, 0xa772fa1cUL, 0xb226b9c0UL, 0x6e82935dUL, 0x771ba235UL, 0xdfdc7920UL,
+ 0xcd3311acUL, 0x8ca54de4UL, 0x9ae453ffUL, 0x3ae2c665UL, 0x5fde9a5cUL, 0x438d652eUL, 0x7a7ca9dbUL, 0xcb25b64bUL,
+ 0x4962bf6bUL, 0xad49387fUL, 0x8d2a07f1UL, 0xd6b8b619UL, 0x7a7269f8UL, 0x6d1389f4UL, 0x7f7ccb88UL, 0x197f21a1UL,
+ 0x171ef4f0UL, 0x6e7947f9UL, 0x377bd1b7UL, 0x633bd1a9UL, 0x47041a33UL, 0x2e91ac93UL, 0xd97143f9UL, 0x83afd08dUL,
+ 0x27ebe6d9UL, 0x6b05308cUL, 0xd502e7efUL, 0x85c25351UL, 0xf532b329UL, 0xd5e962ebUL, 0xaa057771UL, 0xa0dad6b2UL,
+ 0x8ce08e63UL, 0x33847976UL, 0x6f84440cUL, 0xc8144c77UL, 0xe99ebeceUL, 0x361a29d8UL, 0x5acd575bUL, 0x58bb4d2bUL,
+ 0x4ff3d7a6UL, 0xc43df716UL, 0x51d5815cUL, 0xd8ca6f51UL, 0xdeaf98c4UL, 0xd385b950UL, 0xd42291f3UL, 0x341d446fUL,
+ 0x44650a72UL, 0x88c5a936UL, 0x484b640cUL, 0xebce81e4UL, 0x7d93c8a2UL, 0xa8ac5ec0UL, 0x52124fa5UL, 0x1d7f7729UL,
+ 0x602208deUL, 0xe9dc15caUL, 0xc2b2f4faUL, 0xf265c78bUL, 0x97af65dbUL, 0x542929fcUL, 0x31d8d791UL, 0xe6e26c4fUL,
+ 0x5671bddeUL, 0x3d109118UL, 0x2b8c1494UL, 0x1231388UL, 0x4d731139UL, 0xab2667e6UL, 0x40bf6933UL, 0x5eab1f61UL,
+ 0xeda36773UL, 0x85fccbf6UL, 0x62a502d2UL, 0xb9769dccUL, 0xa5c1fbbcUL, 0xe03d20e1UL, 0x60b60913UL, 0x2e1ba7fbUL,
+ 0x4b87428UL, 0x8927f7b9UL, 0x84ccd20bUL, 0x5781d51fUL, 0x2d426de4UL, 0x65c5b6b9UL, 0xd32618cUL, 0xa913c833UL,
+ 0x20458acaUL, 0xa396eed4UL, 0x49537638UL, 0xb1403c77UL, 0xb23fb169UL, 0x26fa0021UL, 0x52e5db94UL, 0xd71ba27fUL,
+ 0x10b5c8f7UL, 0xa4615fe7UL, 0xaf5ae816UL, 0x3c1e8593UL, 0xf6b76c95UL, 0x9719936bUL, 0xc265f692UL, 0x11a4f846UL,
+ 0x58beae80UL, 0x5f44d5b8UL, 0x7b336890UL, 0x1882507bUL, 0x60c42a50UL, 0x773b9bbfUL, 0xa037bd6dUL, 0x24784a0UL,
+ 0xd6cde7f3UL, 0xfcb628b8UL, 0x817d6801UL, 0xc5a4d309UL, 0x469040f9UL, 0xc69228e9UL, 0x844ecbc3UL, 0x14d39b00UL,
+ 0x6979a440UL, 0xfa4a3b18UL, 0xe76c5ef7UL, 0xaa6d6d3dUL, 0x3627e880UL, 0x70bc1453UL, 0x6bc42e2dUL, 0xa78835fUL,
+ 0x3fe82360UL, 0xa16a31a0UL, 0x816bc37cUL, 0xbdb7fec5UL, 0x733bb9d8UL, 0xa1c6ba23UL, 0x4f0a5f2UL, 0xfb6ac5b3UL,
+ 0x252b45a7UL, 0x50a60695UL, 0x49adbf97UL, 0x700586f2UL, 0xc32896a2UL, 0x3487224fUL, 0x896a0b22UL, 0x39b6d8e3UL,
+ 0xaaedce48UL, 0x335f4a81UL, 0x5d830fa9UL, 0x35c8a12bUL, 0xcd462fd1UL, 0x49cf390UL, 0x1eb15885UL, 0x62720948UL,
+ 0xb3475e7fUL, 0xe96236ceUL, 0xf7329201UL, 0x140db193UL, 0xd021e8beUL, 0x58262e39UL, 0x4104bf1UL, 0x6e8d7a29UL,
+ 0x3b1b01a6UL, 0x4498192bUL, 0xaf54c4cbUL, 0x5d459ea9UL, 0x7d3f72fbUL, 0xc5955874UL, 0x588334cdUL, 0x94c2362aUL,
+ 0x63812c9cUL, 0x1e57aa72UL, 0xd16ae4afUL, 0x258cd807UL, 0xbecdaacfUL, 0xbf613e8fUL, 0x46be7619UL, 0x9ebf099aUL,
+ 0x64bed35bUL, 0xb1d294acUL, 0x8701104cUL, 0x4c9e7ce7UL, 0x57cc0c27UL, 0xdce672f8UL, 0x3bac7e6eUL, 0x5d2682deUL,
+ 0xbc21b28dUL, 0xe95b4f40UL, 0x5b76688fUL, 0x829e37e9UL, 0x2ab69c4dUL, 0xb8c9aa9cUL, 0x28e702ebUL, 0x22018721UL,
+ 0xed3ae109UL, 0x70e94d82UL, 0x25dfd4aUL, 0xd687c2cUL, 0x114818feUL, 0x7157fe02UL, 0x4981f9daUL, 0xd131839cUL,
+ 0x360926e5UL, 0xfc4d6b2eUL, 0x278175deUL, 0xf0dd3443UL, 0xe9de0125UL, 0x5d6fedfaUL, 0xb7078e46UL, 0xcbf561b8UL,
+ 0x76698feUL, 0x35392b5dUL, 0x2689d64dUL, 0x123c8a9cUL, 0x32e8c43cUL, 0xc7f30699UL, 0x4275d71eUL, 0x7bf9850aUL,
+ 0x55968ebfUL, 0xbb92e687UL, 0xfff9ec1cUL, 0xb914f18dUL, 0x62226301UL, 0xc8dc753bUL, 0x2c8315b4UL, 0x7e3dfe58UL,
+ 0x29182dc3UL, 0xef52b53aUL, 0x721904d6UL, 0x218492a7UL, 0x29d23c06UL, 0x48be64e7UL, 0x9e1f2f77UL, 0xc3049409UL,
+ 0x5d2e9ec7UL, 0x27d7b1ddUL, 0x5032bd20UL, 0xec314a9eUL, 0x291bf41UL, 0x6b5b9dc2UL, 0xae00d57aUL, 0xb7fd448bUL,
+ 0x87469529UL, 0x2c25de5aUL, 0xc5bac3deUL, 0x3e892d83UL, 0xc09daa62UL, 0x7dde4fecUL, 0xf2259058UL, 0xb79f5190UL,
+ 0xc6cb01ebUL, 0x93d0cd32UL, 0x969fea68UL, 0x28d2929UL, 0x54c181fbUL, 0x44017014UL, 0x7f955e4UL, 0x79545884UL,
+ 0x6a0614f4UL, 0xe6736444UL, 0x318c4acdUL, 0xd99b6a4bUL, 0xd5055a76UL, 0xf02e222eUL, 0xea2dc9c8UL, 0x47f192c7UL,
+ 0xa3d81ffUL, 0xdc829a2fUL, 0x85c9e98eUL, 0x3e820750UL, 0x1759ced1UL, 0xd60e5518UL, 0xbdfb608eUL, 0xa1ee8a71UL,
+ 0x65ddb0a2UL, 0x87ab84a3UL, 0x401e4a34UL, 0x52cffdfaUL, 0xecbb9337UL, 0xbf5f54f2UL, 0x27b105caUL, 0x1eb83770UL,
+ 0x9eefec2aUL, 0x2bdae3UL, 0x3eee4045UL, 0x60ca539eUL, 0x163accc5UL, 0x942afe42UL, 0xf704a1e9UL, 0x5b96feabUL,
+ 0x555c0b5UL, 0xa42a151UL, 0x3f1d3b5UL, 0xaa841788UL, 0xdd34986cUL, 0xaf1e89a4UL, 0x69c2b9d4UL, 0xd352ca2bUL,
+ 0xfe03a649UL, 0xd3517a52UL, 0xf774d911UL, 0xd73e6f7cUL, 0x41527c07UL, 0x7aec989aUL, 0x390ad0d2UL, 0xb813f998UL,
+ 0x5c482f31UL, 0x3895037fUL, 0x2856377dUL, 0x910519d9UL, 0xbf37984eUL, 0x24a6b6e5UL, 0xd3d37fa2UL, 0x5f3101a8UL,
+ 0xdb8d9c3bUL, 0x998a9abUL, 0x166fb063UL, 0x99b0a0ceUL, 0xb1ba2394UL, 0x69c3493eUL, 0x10421018UL, 0xe69942a2UL,
+ 0xdcf1e832UL, 0x7073a3e0UL, 0x69ca405fUL, 0x99201f3bUL, 0x46b61789UL, 0x273609aUL, 0xae06b308UL, 0xee823f39UL,
+ 0xb951e051UL, 0xfe492786UL, 0x8025ef18UL, 0xa9690898UL, 0x9ec3ecb7UL, 0xf9ac97feUL, 0xead20adeUL, 0xd325a47dUL,
+ 0xa257d38fUL, 0xa1e92582UL, 0x603f3da6UL, 0x1df77586UL, 0x40aab419UL, 0x75e03e5cUL, 0x7a956c60UL, 0x77b7c5d7UL,
+ 0xaecb4eeeUL, 0x71ae1e98UL, 0x97554a3UL, 0xf3a49e6cUL, 0xdddecd9dUL, 0x1b44f38bUL, 0x308acb50UL, 0x3a1864feUL,
+ 0x26a12c52UL, 0x6d526c84UL, 0xd3d180d9UL, 0x3880f05bUL, 0x9410929fUL, 0xe12bdf70UL, 0x15004c63UL, 0x6208fdeeUL,
+ 0x359f9d80UL, 0xf542c110UL, 0x46cae834UL, 0xaca0a63aUL, 0x280f9533UL, 0x9e625e67UL, 0x5c0409c2UL, 0x180d40efUL,
+ 0x70c3c618UL, 0x90fe7c51UL, 0x407ed342UL, 0x961bb72aUL, 0xc8c472c3UL, 0x95505588UL, 0x51c13929UL, 0x3b62bf5cUL,
+ 0xebe1b4d4UL, 0xdcf67aedUL, 0x422a1cb9UL, 0x3345d9e2UL, 0xd1c94ae4UL, 0x27311dfeUL, 0x70966bb2UL, 0x875e4e2UL,
+ 0x148ca994UL, 0x59aa953dUL, 0x51536722UL, 0x3d119b30UL, 0xff703312UL, 0x5921a0d2UL, 0x7ed091eaUL, 0x9c501f79UL,
+ 0x22842262UL, 0x98102dfdUL, 0xbf9f9d1UL, 0xb06b5f24UL, 0xa8b538bfUL, 0x6629774aUL, 0x2d1f6c01UL, 0x67422edeUL,
+ 0x64f613ebUL, 0x5faee84bUL, 0x9ccbcc36UL, 0x7a8a4252UL, 0x38907c36UL, 0x25352942UL, 0xf379ad7eUL, 0x7510f15eUL,
+ 0xee4ec7ccUL, 0x956142f0UL, 0x1cdbce71UL, 0x772f56f7UL, 0x4fd6f35cUL, 0xccdfb746UL, 0x70413052UL, 0x9efb9148UL,
+ 0x89c9fdfcUL, 0xd406ac34UL, 0x930a6c87UL, 0x1f42a0f8UL, 0x9f4ce4b6UL, 0xb536be41UL, 0x9685e85bUL, 0x921b7fd8UL,
+ 0xd47bf8acUL, 0xd2003d58UL, 0xd3988b44UL, 0xe0ab92aUL, 0x9de8f51dUL, 0x83da2f00UL, 0xe6e3c372UL, 0xcb208e52UL,
+ 0xee8b3decUL, 0xcb485297UL, 0x22c1ce3cUL, 0x31d67937UL, 0x28ac3a54UL, 0x7843e6c0UL, 0x781ece3aUL, 0xbaaacc80UL,
+ 0x3485c856UL, 0x8b8e4f3eUL, 0x67494a1eUL, 0xa91ab0UL, 0xabf632d2UL, 0xcb15f141UL, 0x8e3a7761UL, 0x6215c764UL,
+ 0x54741dcdUL, 0x2a90be0fUL, 0x76ba1d82UL, 0xe81faa5bUL, 0x1a1a50eUL, 0x83bd0472UL, 0x42688e2cUL, 0xc38754e5UL,
+ 0x139263a8UL, 0x730bda63UL, 0xbd1eee0eUL, 0xa11bc291UL, 0xe7574b7dUL, 0x785da2dbUL, 0x3c22543fUL, 0x1788f977UL,
+ 0x568834d0UL, 0x6dc38559UL, 0xd018654fUL, 0x2d38ebc3UL, 0x4f615207UL, 0xb0e54cfcUL, 0x5ab71280UL, 0x3b79b7d7UL,
+ 0x2d21fb40UL, 0xbbb949daUL, 0x49f5d162UL, 0xfb5af179UL, 0x91b6d4ffUL, 0x3d3d480bUL, 0x24ae172dUL, 0x7cc2da64UL,
+ 0xda0c5c00UL, 0x898361faUL, 0x1b327a49UL, 0xfcd39a75UL, 0xd1eadd2UL, 0xe5964034UL, 0x62109d60UL, 0xa2aa1c65UL,
+ 0x8d87c8f4UL, 0x4bb30b21UL, 0x9bce08b7UL, 0x4226843fUL, 0xb216c1d7UL, 0xf13f2c85UL, 0x34dfa5d0UL, 0xc432f3b0UL,
+ 0x12a2844cUL, 0x982f098dUL, 0x3e32bbaUL, 0xfd16b65cUL, 0x710741c3UL, 0xbe235fc7UL, 0x59f4b90fUL, 0xb90283fUL,
+ 0x8b370473UL, 0xb9b00909UL, 0xb440222UL, 0xcdf45880UL, 0x84823911UL, 0x48fcd267UL, 0xff5d26d1UL, 0x1e65db58UL,
+ 0xdf049188UL, 0x42d6a2f7UL, 0x34e4cd59UL, 0x6290ff59UL, 0xbcd405d9UL, 0x45c81528UL, 0x4e05a2baUL, 0xfafc0484UL,
+ 0x482a58faUL, 0xb048dc64UL, 0x3c8ef04cUL, 0xa2282927UL, 0x82788ed1UL, 0x86e27d86UL, 0x77d374cdUL, 0x2b339819UL,
+ 0x9ff8e59aUL, 0xbfdcc614UL, 0xffde985cUL, 0xc939f12fUL, 0x8cbc1084UL, 0x5f44f893UL, 0x14f5efcUL, 0x79a52e63UL,
+ 0x4931e60aUL, 0x5f1c78f6UL, 0xbbd5bab8UL, 0xd9e8dbd6UL, 0x4e25978aUL, 0x542bae74UL, 0xf2b03b0aUL, 0x289d5ef9UL,
+ 0xdf282d9dUL, 0x237870a3UL, 0x5417951bUL, 0x9d884d78UL, 0x91494443UL, 0xbf7c109fUL, 0x8fd2e241UL, 0xfb311e2aUL,
+ 0xfeafa1cdUL, 0x6123a5bcUL, 0xa9494e00UL, 0x179df607UL, 0xbd24ebddUL, 0x3e0f4c84UL, 0x435c6b43UL, 0xee911e6bUL,
+ 0x3a157c25UL, 0x951b63fbUL, 0xb00790d7UL, 0xcc931defUL, 0x6bbf9b46UL, 0x7fa115dcUL, 0x5dedbb6fUL, 0x8b18ba44UL,
+ 0xa7e614a6UL, 0x1cb6c8a2UL, 0x10e32c04UL, 0x2b4b3f95UL, 0x30eaaa8cUL, 0x8af2af56UL, 0x1f8cee17UL, 0x33ec971UL,
+ 0x628c84d6UL, 0xbd48833dUL, 0x66198bbeUL, 0x33164d0aUL, 0x37fedaf5UL, 0x9c3f7c6bUL, 0xcbc3da2UL, 0xacfefff5UL,
+ 0x771292b6UL, 0x9991341UL, 0x5d6ff030UL, 0xbf6eff1dUL, 0x744e56edUL, 0xb6943e11UL, 0xc5df0c9aUL, 0xec8684edUL,
+ 0x7059455eUL, 0xb6367634UL, 0xa43b667aUL, 0x36292245UL, 0xc03990b9UL, 0xcac3d08aUL, 0xbcd1caa8UL, 0x3cc088aeUL,
+ 0xb85da2b6UL, 0x8b340d06UL, 0xfbe3ede5UL, 0x6a0a45e1UL, 0x6345a7a0UL, 0x77604254UL, 0x7e25e1c5UL, 0x3ead9cf7UL,
+ 0x51788049UL, 0x18c7e177UL, 0xd5d1079fUL, 0xad29b7b1UL, 0x2af18da1UL, 0x39ac1e49UL, 0x7ff7dc80UL, 0xf2be8273UL,
+ 0x115e74d8UL, 0x85d0855bUL, 0xbbe99701UL, 0xaaf005b7UL, 0x61783238UL, 0x6f363717UL, 0xf4418681UL, 0x7510cddbUL,
+ 0xa69457bdUL, 0xddd3d08fUL, 0x691b8063UL, 0x45e71a52UL, 0xe9f18809UL, 0xa17c3b3UL, 0xde679431UL, 0x5314846UL,
+ 0xf343d782UL, 0x33ac92e5UL, 0xf4509ee8UL, 0xe7d2da12UL, 0x368b114bUL, 0x3f574c7aUL, 0x3a624566UL, 0xd6d819dUL,
+ 0xc7f4a96cUL, 0xb523ddeeUL, 0x58ed0e16UL, 0x47c37910UL, 0xc93ae8a4UL, 0x448ae36UL, 0xb4375e6fUL, 0x7feeeb29UL,
+ 0xb0e21e73UL, 0x864591c7UL, 0xdf7a6a77UL, 0x8c062f29UL, 0x6afd0ff4UL, 0xa5583a56UL, 0x9d6d19a7UL, 0xc5e65552UL,
+ 0x3a38e263UL, 0xa82ec65cUL, 0xf4d10c52UL, 0xe8bd8838UL, 0xe462f751UL, 0x34c9eac7UL, 0x57c49d13UL, 0xf2afbe33UL,
+ 0xab5382c6UL, 0xce12313bUL, 0x9e21e275UL, 0x86cc86a1UL, 0x231b1208UL, 0x744b0d20UL, 0xf448f722UL, 0x5eaa0fa5UL,
+ 0x88176363UL, 0xe49e0b18UL, 0xf1bd2e65UL, 0xf224ca72UL, 0xfa06a807UL, 0xf4c7b4c2UL, 0xee3f46caUL, 0xf1c643c2UL,
+ 0x3c582a83UL, 0x5869ee59UL, 0x8145ee7fUL, 0x2ed4f6f3UL, 0x41dd8e4fUL, 0x62ea309fUL, 0xfa59d108UL, 0x6cdaae7fUL,
+ 0xc027e36bUL, 0xb4047e21UL, 0x30d60439UL, 0x2e6bfcd5UL, 0x435d04c2UL, 0x4a31ff3cUL, 0x20442679UL, 0xf28741d1UL,
+ 0x4408ddcaUL, 0xd2af2deaUL, 0x83a6eae8UL, 0xb0aa0295UL, 0xdfdfe874UL, 0xa4cc9f40UL, 0x49008128UL, 0x1fdb3cbdUL,
+ 0xf2c4d177UL, 0xd323bf94UL, 0x1f01a1ffUL, 0x82c7a6eeUL, 0x7b39cb6dUL, 0x9fb6375cUL, 0x56f4fa9eUL, 0xa24168cUL,
+ 0x4a7f8f56UL, 0xa4778b36UL, 0xaf3040cdUL, 0x12708b47UL, 0xac7e52a2UL, 0x5ab7a26cUL, 0xa9baa456UL, 0x9ec96bc8UL,
+ 0x7745265cUL, 0x79ca9e91UL, 0xa9fd05bdUL, 0xa65a12c4UL, 0x56ba177aUL, 0x6976e0efUL, 0xc28813dfUL, 0x61fd9d74UL,
+ 0xf4e5419UL, 0x10fe183eUL, 0x90f761dcUL, 0x5da5f5dUL, 0x6a637cdeUL, 0x9cc3ceffUL, 0x193958f0UL, 0x5516cf21UL,
+ 0x167ba0f0UL, 0xad733b75UL, 0xfcf96d1bUL, 0x3780cfffUL, 0x249cfc14UL, 0xc04df343UL, 0x27eca724UL, 0x1609fa22UL,
+ 0xc6b00ddaUL, 0xf4058c1bUL, 0x8da6c3eaUL, 0xd1fd7097UL, 0x26c95be4UL, 0x81569a5fUL, 0xd3e3eae9UL, 0x259bb5c5UL,
+ 0x82f76b70UL, 0x88dfd0f7UL, 0x538babc6UL, 0x25e9a0f8UL, 0xc5750adaUL, 0x931fb7f4UL, 0x5cbd93deUL, 0x475268UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x36fde350UL, 0x1d62debeUL, 0x475a89d3UL, 0x5073f2cdUL, 0x7ff5a51eUL, 0x4efecd6UL, 0x6b04e96aUL, 0x2e090656UL,
+ 0x15a93a95UL, 0xebf7691cUL, 0x7986c246UL, 0x3f509d46UL, 0x6a452af2UL, 0xa06adef2UL, 0x8ea771c6UL, 0x39e72feeUL,
+ 0xcef5a059UL, 0x4938b1dUL, 0xc2e8410fUL, 0x77979b83UL, 0x297cedb4UL, 0x47834657UL, 0xa0245161UL, 0x807c48cdUL,
+ 0x7478859bUL, 0x22ad4674UL, 0xf6eb83ebUL, 0x736e4fbUL, 0x47e10b8bUL, 0x9e519a3dUL, 0xfb33c1a8UL, 0xaf3b04aaUL,
+ 0xc366bba4UL, 0xada2695dUL, 0xb9f8cbf2UL, 0x64a85fd0UL, 0xbde9a5c6UL, 0xb373b06UL, 0x691fbda1UL, 0x83dac07UL,
+ 0x1c24f6cbUL, 0x195af810UL, 0xc7bc5b1bUL, 0x3a91ceffUL, 0xe06c1163UL, 0x12d2ec3cUL, 0xde7a782dUL, 0x37b2f666UL,
+ 0xedb78c96UL, 0x870e8d95UL, 0xfc0041fcUL, 0xfc86a84dUL, 0xf943376aUL, 0xa510ce6UL, 0x69b08fc2UL, 0xd6e70294UL,
+ 0x36385c4aUL, 0xf683d07eUL, 0x107c6fcaUL, 0x5e3e25a9UL, 0x9b40f07dUL, 0x9a818019UL, 0x17eef59UL, 0x763acbdeUL,
+ 0x99b8fba7UL, 0xbc6ae225UL, 0x1477f8d9UL, 0xc44023f1UL, 0xb5ab4f9dUL, 0x72819508UL, 0x6e0274cUL, 0x21347b6UL,
+ 0x610816a7UL, 0x6b12529eUL, 0x5044e5e9UL, 0x938586eUL, 0x6984c697UL, 0x82306617UL, 0xefd46b5eUL, 0xa7f517d4UL,
+ 0xf01972cUL, 0x9d3cc352UL, 0xf9da0730UL, 0xd79e1981UL, 0xb31939c1UL, 0xfa6b5602UL, 0x29e52ff0UL, 0x14ba769eUL,
+ 0xef2200f6UL, 0xb562b42dUL, 0xf29cdedUL, 0xa252aff0UL, 0xa4c6b26cUL, 0x38228011UL, 0x633d3b0dUL, 0x478c154bUL,
+ 0x5e80be63UL, 0xf2f7b367UL, 0x4ba3c31aUL, 0x73a28e86UL, 0xafe86dbeUL, 0x32351d82UL, 0xe911077eUL, 0x1ae205a3UL,
+ 0x541bdcdfUL, 0x93c6c2ddUL, 0x4c110d4UL, 0x2cdd9066UL, 0x7bb54f1eUL, 0x50e5b505UL, 0xb6e9a412UL, 0x244c5827UL,
+ 0x49eab95aUL, 0x3dd8af31UL, 0xd2940385UL, 0x7122eac6UL, 0xa7844d63UL, 0x9f98509eUL, 0x8c51ddfUL, 0xf62af1cUL,
+ 0xa6256c49UL, 0xfd445e06UL, 0xd6bd49b8UL, 0xf36993bcUL, 0xe4b6cec4UL, 0xbe6e780dUL, 0x9c754871UL, 0x4e9f358fUL,
+ 0x8414c34fUL, 0x65fdbda9UL, 0x5f3e8df1UL, 0x72c8d455UL, 0x697186ddUL, 0x5f571cd1UL, 0x43b8391bUL, 0xf3c96ac1UL,
+ 0x2c1ea0e3UL, 0x2cf522d0UL, 0x804f8b32UL, 0x5eaa94e3UL, 0x85c6946aUL, 0x42e9f97eUL, 0x593db999UL, 0x67b3fb75UL,
+ 0x4e96a978UL, 0xe5d2095eUL, 0x64031240UL, 0xfc509c0aUL, 0x412570afUL, 0x377b3714UL, 0x699b220UL, 0x45c53acdUL,
+ 0xa3fac915UL, 0x330e249fUL, 0x91ad0883UL, 0x4ccbd5aeUL, 0x202374c0UL, 0xd25cc374UL, 0x3c57934dUL, 0x138b085fUL,
+ 0xfe08fd08UL, 0x97d62a8cUL, 0xd3de9b37UL, 0x9fd665eUL, 0xc24cdf5aUL, 0xe1cec330UL, 0xffd695d8UL, 0x61a4248bUL,
+ 0xb76d143aUL, 0xdf37ff52UL, 0xb162df45UL, 0xdc58d12eUL, 0x548ddc21UL, 0xebf85d44UL, 0xcb4f56aeUL, 0x23dd7aUL,
+ 0x242b0f1fUL, 0xd46f595fUL, 0xb1b03c46UL, 0xbd486922UL, 0x6e017502UL, 0x728d6ff7UL, 0x67ba71ceUL, 0x3bbc3b44UL,
+ 0x8fabaebcUL, 0xce85ab3cUL, 0xb21efee0UL, 0x18076e33UL, 0x4b53b1dfUL, 0x5c395d8cUL, 0x7ff81c6fUL, 0x269657e6UL,
+ 0x96b34b4cUL, 0x9e70a323UL, 0x88a12c0UL, 0xeff366edUL, 0x2ef45043UL, 0xa8fc80a1UL, 0xeddafdf6UL, 0x72858f34UL,
+ 0x6eaa3547UL, 0x62480affUL, 0x959b6476UL, 0xc02f161cUL, 0xd6c25236UL, 0xfd354bbaUL, 0xae4b6456UL, 0x9b368eb1UL,
+ 0xe4cd0608UL, 0x8e2f8708UL, 0xb7ce1ae8UL, 0x14cc0358UL, 0xaa21b493UL, 0x6dcdf4e1UL, 0x9b0a33baUL, 0xdaf232ffUL,
+ 0xf7a378f6UL, 0x1157aa4cUL, 0xf54674e5UL, 0x57a9c2bdUL, 0x20f6bd0aUL, 0x6e1f89f9UL, 0xbfef6543UL, 0xd29e7ac4UL,
+ 0x255b06acUL, 0x8f83faabUL, 0xfdee85b4UL, 0x96e24d28UL, 0x93367967UL, 0x78c7342eUL, 0xd48ac8b7UL, 0x9d8bd952UL,
+ 0xbc1a6fa5UL, 0x9fa844eUL, 0x6e79902bUL, 0xe780d228UL, 0x19ad932UL, 0x9a60b2f1UL, 0x7bda1f2cUL, 0x71cc048UL,
+ 0xda794442UL, 0x888e3b99UL, 0x5563d722UL, 0x2804fa11UL, 0x4b7697a7UL, 0xd619d810UL, 0xde3a7b41UL, 0x98322739UL,
+ 0xe0663659UL, 0x166941aUL, 0xde26bab0UL, 0xc93ed6ccUL, 0xd6536521UL, 0x39c7a8dfUL, 0x44ecb164UL, 0x300793d0UL,
+ 0xe53a3fdeUL, 0x1c966583UL, 0x308f46e5UL, 0x32003f68UL, 0x57f035dbUL, 0xf36a79dfUL, 0xc65a4d10UL, 0xc957fe47UL,
+ 0x274e3585UL, 0xd879d46cUL, 0x842e76acUL, 0xe9e86f32UL, 0x648e6bc2UL, 0xcec518d7UL, 0xf69b1968UL, 0x41356f7UL,
+ 0xcdb544UL, 0xee2b81c3UL, 0xd3f0c8ccUL, 0xc6935abbUL, 0x34fc0205UL, 0xc65e1f70UL, 0xea5dd9efUL, 0xd836e975UL,
+ 0x20ab1f08UL, 0xef8824a7UL, 0x6fd3470dUL, 0xfbec080dUL, 0x1909ad42UL, 0x1378dcd7UL, 0xf64ace72UL, 0x35f469ccUL,
+ 0x352ec5c1UL, 0x8abf7bceUL, 0xb7397a1fUL, 0xb0aec3ebUL, 0xeaacc683UL, 0xcf362043UL, 0xe678c14UL, 0x5e2bfebaUL,
+ 0xde8f3c68UL, 0x70e4572eUL, 0xf2d20282UL, 0xa5cad44cUL, 0x250dc3baUL, 0xe215759eUL, 0xec69ccf0UL, 0x89dd7c43UL,
+ 0xd2953b6aUL, 0x10d0c73aUL, 0x3b2ad66aUL, 0x6c582d48UL, 0x38e050f9UL, 0x9db16c97UL, 0xd23d26c8UL, 0x2ef9dbf7UL,
+ 0x5a611836UL, 0xde38ccaeUL, 0x4eb26b73UL, 0x30e84526UL, 0xeae09554UL, 0x769cd30eUL, 0xc38aeb29UL, 0x242f6dc4UL,
+ 0xdfd18624UL, 0x25e8ae7aUL, 0x6ab50a96UL, 0xa2b88c9aUL, 0x9f6c19b8UL, 0x37e19f60UL, 0x2828d0baUL, 0x80b50ec9UL,
+ 0x8a021cd3UL, 0xf3f80809UL, 0xf4887674UL, 0x33dec823UL, 0x1b3157b0UL, 0xd399931cUL, 0x25270702UL, 0x19c81edeUL,
+ 0xf386597aUL, 0x43654f0aUL, 0x1478886bUL, 0xf43f6211UL, 0x9439a80UL, 0x626327bUL, 0x99ebbb1eUL, 0x7dd96e96UL,
+ 0x6938e247UL, 0x392053f2UL, 0xfd7a0e6dUL, 0x709e2330UL, 0x255e89aUL, 0xec8badcaUL, 0xaf92fe3fUL, 0x2fb8df74UL,
+ 0xe8ab821UL, 0xc5530495UL, 0xcce6fb00UL, 0x47f07d94UL, 0xc5eeb7e2UL, 0x5445d467UL, 0x5a813fe1UL, 0x866759edUL,
+ 0xa2034740UL, 0x4816c63dUL, 0xf3e7c1aUL, 0x4d379f8eUL, 0x7768af27UL, 0x59e2d6aeUL, 0xa5c3bfbcUL, 0x22160888UL,
+ 0x48bcf8b9UL, 0xf9346ac6UL, 0xe161e554UL, 0x960c1ca1UL, 0xa76a7697UL, 0x961edb72UL, 0x22cd658bUL, 0x29330212UL,
+ 0x520d676UL, 0xa3d77a2UL, 0x7847d9e8UL, 0x849303bUL, 0x429b33a3UL, 0x23a3e77aUL, 0xbaa27ca1UL, 0x252a72cfUL,
+ 0x9036fc2cUL, 0x6b972c86UL, 0x1c9d0c5dUL, 0x586c299cUL, 0xcb1f251eUL, 0xe9be67b2UL, 0x7dddecb1UL, 0x478a451eUL,
+ 0x55a35629UL, 0xdd186406UL, 0xb7c8f90UL, 0xa53023b4UL, 0xc570afe6UL, 0xf4b6538eUL, 0xa87a67e5UL, 0xc7b6fdb5UL,
+ 0x1249ce15UL, 0xc47a5849UL, 0x4cf6ed34UL, 0x5d2ab9ceUL, 0x257bec4bUL, 0x94171af2UL, 0xd936a0c5UL, 0x15e846c0UL,
+ 0x6334d775UL, 0xb230f9e1UL, 0xa70c20e8UL, 0x81500d4aUL, 0x97c9875eUL, 0x922bddb1UL, 0x108af1c6UL, 0x3f6310fdUL,
+ 0x33df40c1UL, 0xb3277463UL, 0x6ef1e9b3UL, 0x45564efaUL, 0x9f87fc4eUL, 0x39e650aeUL, 0xe8f150e4UL, 0xf788265eUL,
+ 0xd992a5f3UL, 0x5db325ddUL, 0xa9639a0UL, 0x7115d3faUL, 0xd39ff2ffUL, 0x62632dcbUL, 0x8b5a3cbUL, 0x374ef212UL,
+ 0x2e6c5f02UL, 0x5c64d6f1UL, 0x368843d9UL, 0xbd47da3eUL, 0x4b89e34aUL, 0xfaf66dd6UL, 0xc70ca18cUL, 0x7ce49e06UL,
+ 0xffef7751UL, 0x840fd321UL, 0x95708df1UL, 0x41c36ec9UL, 0x3da83b4cUL, 0xbd4aa48bUL, 0xe9fa1b6bUL, 0x6e3c7986UL,
+ 0xd7c35ce5UL, 0x16b5d109UL, 0x7868f750UL, 0xce435750UL, 0x76f36159UL, 0xa983d5fcUL, 0xdc3bac9dUL, 0x3549d9UL,
+ 0x7bf70a6cUL, 0xa6c409e5UL, 0xa087eceaUL, 0x27f52275UL, 0xc14adaedUL, 0x62b5ae69UL, 0x87750605UL, 0x969e4535UL,
+ 0xb2c2ee7cUL, 0x5a389f44UL, 0x570b5aecUL, 0xdc4e50c8UL, 0xed02b73bUL, 0x27ecc914UL, 0x60e5f1d6UL, 0xe148aa00UL,
+ 0x33379b1cUL, 0xf02c7d02UL, 0x7a325087UL, 0x6ef28ae5UL, 0x1146041bUL, 0x51f0b200UL, 0x654d76cfUL, 0xff699f4cUL,
+ 0x6cb6b7bfUL, 0xa4e11157UL, 0x330b19ffUL, 0x9c637c95UL, 0x8b2fe981UL, 0x9e526eb1UL, 0x5c1cad7fUL, 0x5eeba741UL,
+ 0x9d796c50UL, 0xb654318dUL, 0x57fab2beUL, 0x1cffd4dfUL, 0xc98901ffUL, 0xda579b66UL, 0xeb582430UL, 0xaea7033fUL,
+ 0x611d1f72UL, 0xa08399c7UL, 0x979fd594UL, 0x31e010b2UL, 0xe19647b3UL, 0x4b3437feUL, 0xda1f257eUL, 0xee62d0d9UL,
+ 0x223dc7dbUL, 0x71c116adUL, 0x48cbd6f6UL, 0xfc20a0aeUL, 0xe8845936UL, 0xb1d46ac4UL, 0xaaec16fcUL, 0x2b1ecf8bUL,
+ 0x8bee85a1UL, 0x41bec632UL, 0x262288ffUL, 0x6dc89fc2UL, 0xfbaa5ea7UL, 0x942ffc70UL, 0x74d5e353UL, 0xb9f1e6e2UL,
+ 0x19b777c7UL, 0x7f0f6ce3UL, 0xc13e6e22UL, 0xfe1327feUL, 0xf3f6b277UL, 0x6c8165c2UL, 0xf14bb23fUL, 0x81dc29f2UL,
+ 0x37ee5d49UL, 0x62ee90a2UL, 0xf1839a11UL, 0x3b095fa7UL, 0xfa2789ffUL, 0x58b944e3UL, 0xde4e4886UL, 0x4cf33b9cUL,
+ 0x8dddfb64UL, 0xc0459253UL, 0xe62fec96UL, 0xbd8b6021UL, 0x75110565UL, 0x3ea4b01bUL, 0xf9361c38UL, 0xc4828711UL,
+ 0x9fec5f2dUL, 0x95b35c57UL, 0x80c44b49UL, 0x9a66af37UL, 0x48ecddbeUL, 0x711f7107UL, 0x38fd6f68UL, 0x83cbfb49UL,
+ 0x71316188UL, 0x88b97649UL, 0xa4368ee4UL, 0xba484f38UL, 0xfdb676a0UL, 0xe7b560a2UL, 0x229c6385UL, 0x5f52f6c5UL,
+ 0xeee8e9d6UL, 0xca54684cUL, 0xd8336c67UL, 0x2bc2b289UL, 0x9550ededUL, 0x7be4a3e3UL, 0x90de4d15UL, 0xe98db452UL,
+ 0x5aa1cf50UL, 0xb53e0506UL, 0xbbb9ee5fUL, 0xca030f74UL, 0xe8268b7bUL, 0x115ed569UL, 0xfd51da5cUL, 0xafb0d229UL,
+ 0x763152baUL, 0x77fc29a5UL, 0x9d617964UL, 0x757e502cUL, 0x22f1c0bbUL, 0x6ea07e34UL, 0xeddb0233UL, 0x2aa5d812UL,
+ 0x677ebe30UL, 0x887880fdUL, 0xa7913100UL, 0x37442592UL, 0x9bba27c9UL, 0x1b9bfa3cUL, 0xc9ed7787UL, 0xd0f4ab7cUL,
+ 0x8b441ad8UL, 0x23a467f6UL, 0xc28d4493UL, 0xd45859e8UL, 0x506bea86UL, 0x69398f05UL, 0xedf58b4dUL, 0xee4e794dUL,
+ 0x66dc9f6aUL, 0xdf5a17bcUL, 0x34d5d7fbUL, 0x407e176fUL, 0x934319a0UL, 0xf30f96a7UL, 0xa4423286UL, 0x9866cf03UL,
+ 0xdf46105fUL, 0x6b088722UL, 0x5c46e623UL, 0xb76c6cd2UL, 0x2921adc1UL, 0x4d82d671UL, 0x8b3ead52UL, 0xa707c8c3UL,
+ 0x2dbbd1cdUL, 0x1fc32e6aUL, 0x5d46614dUL, 0xe1c01b59UL, 0x8340ee6bUL, 0xbd84596bUL, 0x9412be49UL, 0xab6063d4UL,
+ 0x16f0fd37UL, 0xbae67d78UL, 0xf3cdfd6bUL, 0x3ebc5e86UL, 0xded3027cUL, 0x6cd3fecfUL, 0xc2bc659aUL, 0x5283a5c5UL,
+ 0x787ffc23UL, 0x4457b186UL, 0xc7d97257UL, 0x96df4f84UL, 0xa7abc3b6UL, 0x642b23efUL, 0xc5eb99ebUL, 0x449c48bUL,
+ 0xf23cf7f0UL, 0x1145e5f6UL, 0x6d938e5bUL, 0x8342862fUL, 0x27a6731eUL, 0x1b99116UL, 0x85996ea4UL, 0x3c29b8ebUL,
+ 0xbf5a3e54UL, 0xed8528e5UL, 0x630f2cd3UL, 0x243d5d34UL, 0x8efa764dUL, 0xb011832dUL, 0x5cd04a4dUL, 0xb74401c1UL,
+ 0x57aeee47UL, 0xbf69150UL, 0x3ef345f8UL, 0x671bae14UL, 0x68696726UL, 0x3d27fe84UL, 0xf1fff006UL, 0x66085772UL,
+ 0x70b011f4UL, 0xeddc134fUL, 0xd9e565c0UL, 0x2becbe4fUL, 0xd3585d7cUL, 0xaede1399UL, 0xa89ed49UL, 0x348c7997UL,
+ 0xcd93a81aUL, 0xf21e49a8UL, 0x9210fd20UL, 0xc35cdf14UL, 0x8a2db79fUL, 0x350f4abcUL, 0x18ab1cbaUL, 0x20c895a3UL,
+ 0x98cdfad3UL, 0x8e45fa2cUL, 0xf66d6eb2UL, 0x9e5795d2UL, 0xe71421a6UL, 0x72537a60UL, 0x2b1486c7UL, 0x74d21c78UL,
+ 0x7e641999UL, 0x7ef6b647UL, 0x6d6a6b1cUL, 0x78112bc2UL, 0x2895770fUL, 0x96f7645eUL, 0x4e0c8628UL, 0xbbfca74bUL,
+ 0xd1dc8e2eUL, 0xc7238a36UL, 0x5d4259a2UL, 0xba77937cUL, 0xcc4d63f4UL, 0xcccde4e6UL, 0xaa95d43UL, 0x27d2816UL,
+ 0xe58f2d07UL, 0x52de3061UL, 0xff4de8c1UL, 0xe799ca9bUL, 0x49391648UL, 0xf26e10bbUL, 0x2f6cdb86UL, 0xd729d5c5UL,
+ 0x92b558d5UL, 0x7606f4e8UL, 0xb38c0a9cUL, 0x9871c5ecUL, 0xd120d16bUL, 0xd9259d64UL, 0x651f2e90UL, 0x2f6a5b9dUL,
+ 0x5805ebe6UL, 0x31186ae3UL, 0xbf71ebaeUL, 0x9c01f78fUL, 0xb6a0ec23UL, 0x5ce95e72UL, 0x53b49be8UL, 0x170a7c68UL,
+ 0xf3730b74UL, 0x6aee582cUL, 0xe32f1b6aUL, 0x3eb9b89dUL, 0xe77140fdUL, 0xbbb1130bUL, 0x3a9568ccUL, 0x15a817a1UL,
+ 0x329c9670UL, 0x29bf9693UL, 0x370a901cUL, 0x50400793UL, 0x6702c764UL, 0x6ed9bce8UL, 0x3fa39db9UL, 0xd32c71f1UL,
+ 0xcc0b3257UL, 0xb9bb1d8fUL, 0xbab8a979UL, 0xd645303fUL, 0x5ea67b01UL, 0xe83ab9bfUL, 0xc40090beUL, 0xd13cf9dfUL,
+ 0xe480ea25UL, 0x87495f30UL, 0xf27a0cf0UL, 0xc00b5ed9UL, 0xcbd9be82UL, 0xf6f8d03UL, 0x1a323834UL, 0x1ce625acUL,
+ 0x8df23b9cUL, 0x595e71ebUL, 0x6a273277UL, 0x4bf8f837UL, 0x7bc96850UL, 0xb020e03cUL, 0x732d2ffUL, 0xabda005eUL,
+ 0xc9b035bUL, 0x962c79bdUL, 0xf1015fddUL, 0xa33715ddUL, 0xd88f6d59UL, 0xfed0f2e4UL, 0x711c72fcUL, 0x9d0a936dUL,
+ 0x3a32b997UL, 0xa6dd6e06UL, 0xaed65503UL, 0x803bd4a8UL, 0xfc85b0e2UL, 0x205c1ae9UL, 0xfb92fda6UL, 0xd34b49eUL,
+ 0x83063ffUL, 0x1095e47eUL, 0xb0194402UL, 0x69bdd68UL, 0x82527461UL, 0xdf8747a1UL, 0x3a2cf0b8UL, 0xcd7247b3UL,
+ 0xb93c45c8UL, 0x7ec68f94UL, 0x1966a5f9UL, 0xe12337c1UL, 0xd7300bf0UL, 0xebe9173eUL, 0xcfe53e45UL, 0x5130be75UL,
+ 0x8c241973UL, 0xa55eee5aUL, 0x7b41758fUL, 0xaeb09d4bUL, 0x252ed708UL, 0x85739394UL, 0xc699c2edUL, 0x25f363e2UL,
+ 0x701e4b0eUL, 0x4f63ca35UL, 0xf7e3200bUL, 0x4826e4bUL, 0x84a9f45eUL, 0x572f49c4UL, 0xd52fce0fUL, 0x3dad1a0aUL,
+ 0x5a4da88dUL, 0x7969f606UL, 0xed5a5d1UL, 0x172dcd1bUL, 0xa0b1a979UL, 0xef1ac6bdUL, 0xd72c1c5cUL, 0xd027efdcUL,
+ 0xaf16cd37UL, 0xec99777fUL, 0xa827733dUL, 0x1589b0e7UL, 0x4c5f1c7bUL, 0xcffbf14aUL, 0xd0bc5012UL, 0xd6dc5622UL,
+ 0xf9cf8c04UL, 0x858b1ae7UL, 0x82ddf18dUL, 0x31f24c81UL, 0x1af4f11bUL, 0x122d12b7UL, 0xa8708b7aUL, 0xe4dffbd6UL,
+ 0xc90a583cUL, 0x7ddb6722UL, 0x8d6a516fUL, 0xacf1e21fUL, 0x9f280144UL, 0xc3c1d5d4UL, 0x7ccdd4faUL, 0xcae38b0dUL,
+ 0xadbe795eUL, 0xd3f050c4UL, 0xf706955fUL, 0x96dacb50UL, 0x103c05d6UL, 0x4abe0006UL, 0xdb879552UL, 0xc3a919deUL,
+ 0x7cf8ffddUL, 0xdca1cfadUL, 0x9dd938dcUL, 0x6421ede3UL, 0xa0bf7c8bUL, 0xcfd3de74UL, 0xbb56a833UL, 0x22709658UL,
+ 0x41e34195UL, 0x83fbdcaaUL, 0x313d7721UL, 0xe5a9005bUL, 0x9b2f0a88UL, 0xb1b8a60bUL, 0x4b1859a7UL, 0x30649902UL,
+ 0x250aaecfUL, 0xe7fbd9bbUL, 0x12c8da9cUL, 0xc1a63c6aUL, 0x2e34cabcUL, 0x2a2280fdUL, 0x89193cf4UL, 0xe078dcd8UL,
+ 0x78aa8de4UL, 0xe19f4704UL, 0x4972799UL, 0x96c38e25UL, 0x83aca962UL, 0x7ac62b7dUL, 0x4433b83bUL, 0x1709daeUL,
+ 0xfb3f601cUL, 0xa2f81a0cUL, 0xaca7f43bUL, 0x11da43a2UL, 0x9d9380a0UL, 0x285247a0UL, 0xf8533edcUL, 0xccf91b97UL,
+ 0xcc0777efUL, 0x8c723d80UL, 0x8c175396UL, 0x9643f79cUL, 0xd1d85534UL, 0x8e63212dUL, 0xfcd976a5UL, 0xab9ba44fUL,
+ 0xcd8c12feUL, 0x8eb7f612UL, 0xd69e8ecbUL, 0x1f22a2e5UL, 0x554f06e5UL, 0x421ad06UL, 0x30428efdUL, 0xb0c26494UL,
+ 0xe40f0d2dUL, 0xb08ae4e9UL, 0x49e335d0UL, 0xf35c21edUL, 0xa8ee02eeUL, 0xf295e325UL, 0xebb216c3UL, 0xcf4df981UL,
+ 0x1ed93808UL, 0x4ceee591UL, 0x60cec8cUL, 0xa78a3e07UL, 0x749e6cc9UL, 0x20fc3260UL, 0x8466b867UL, 0xd369928cUL,
+ 0x24a67941UL, 0x851c4fcUL, 0x648fc9eUL, 0x82d8e7UL, 0x8875d050UL, 0x3efb5a97UL, 0xe9365f8bUL, 0x567530a8UL,
+ 0xb5105d96UL, 0xbc300883UL, 0xf59e1b19UL, 0x2870861bUL, 0x35b76021UL, 0x71f3a324UL, 0xca63523bUL, 0x166d735UL,
+ 0x712cf3d5UL, 0xfe0d8535UL, 0xfef0521dUL, 0x7ed084eaUL, 0x85c90242UL, 0x90d8a804UL, 0x6f34b2e1UL, 0x3c0655aaUL,
+ 0x25b720d2UL, 0xb1223c2eUL, 0x92a99300UL, 0xcfe475daUL, 0xc6baa30fUL, 0x9d72ad19UL, 0xe7b30e72UL, 0xc806625bUL,
+ 0xd3224f43UL, 0xee6cffb7UL, 0xf761f5aUL, 0x68ddb251UL, 0xecdf718cUL, 0xe943660dUL, 0x19e75aa4UL, 0x15aa6880UL,
+ 0x819d6dedUL, 0x68cff2a2UL, 0xde368c36UL, 0x8503c04UL, 0x33cebc21UL, 0x80a82367UL, 0xc7f0986UL, 0xa2a464beUL,
+ 0xc4ad4909UL, 0xf1078d6dUL, 0xec908e74UL, 0x9e697a91UL, 0x54a222f9UL, 0xe8a29c40UL, 0x89a72534UL, 0x1f5c46ddUL,
+ 0xb9b93214UL, 0xfbe3ef56UL, 0x73cb36e6UL, 0xe9fb60f6UL, 0xa763d6daUL, 0xe1a3341eUL, 0xcaa78bacUL, 0x29237861UL,
+ 0xde24c262UL, 0x915a529aUL, 0x96e71f3fUL, 0xb6d73e25UL, 0xb353d726UL, 0x162e796eUL, 0x70f8bf86UL, 0xa8293b3dUL,
+ 0x83fe1eafUL, 0x2c4e07f4UL, 0x48902722UL, 0x9a63e21bUL, 0xc834df1dUL, 0xc56e45c8UL, 0xa5bd525cUL, 0xe3e6ef04UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x6ae15bbfUL, 0xcf66e646UL, 0xd1f11498UL, 0x5a618993UL, 0xc9dfe68bUL, 0x7a123731UL, 0x4ea775b0UL, 0x6bff1cd7UL,
+ 0xf22503feUL, 0xa96ba677UL, 0xf7335a44UL, 0xf547b99aUL, 0x14aded78UL, 0xc428d105UL, 0xee8f6598UL, 0x4f93608UL,
+ 0xf88dfe0cUL, 0x615ae6f4UL, 0x141a2e57UL, 0x4cc0f5e3UL, 0x4801b8f4UL, 0x15d80861UL, 0x5d11ac27UL, 0x5d30177bUL,
+ 0x4a0a918aUL, 0x4ac8840dUL, 0xe5328a23UL, 0x754f6435UL, 0x1abff225UL, 0x3ba6951eUL, 0x99a13ab5UL, 0x94f4440bUL,
+ 0x702641bdUL, 0x7ce06cbdUL, 0xbc5f789cUL, 0x6d61ded5UL, 0x6e5bf39eUL, 0xc11e4f48UL, 0x575f27d5UL, 0x932c4d59UL,
+ 0x9e0409e7UL, 0x2baf828dUL, 0xbec3c4c2UL, 0x32e61bbfUL, 0xff18ba90UL, 0x18077144UL, 0xf49d939aUL, 0x4d52abd4UL,
+ 0x8966ba1UL, 0xf76f292eUL, 0x2a1d44aaUL, 0xd38162f2UL, 0xdf3f5a37UL, 0xb6a4add1UL, 0x4f960512UL, 0x4d01f4e1UL,
+ 0x1223d13aUL, 0x89cbe345UL, 0x121f814bUL, 0xc0fb5b6bUL, 0xc6893412UL, 0x6eedbc7dUL, 0x29fbca28UL, 0xed54c621UL,
+ 0x6ae6ecfaUL, 0xf46c3fbaUL, 0xea719dafUL, 0x42733fd0UL, 0xcf050524UL, 0xc8c4b3UL, 0x3075bcafUL, 0xc387573bUL,
+ 0x74ce0b01UL, 0x97002809UL, 0xcb6673dUL, 0xa11261f5UL, 0x843d9067UL, 0xe35e5162UL, 0x18bc021bUL, 0x8502f8ffUL,
+ 0xe6f429c5UL, 0x2aa18b10UL, 0x685f5b1cUL, 0xea2d8042UL, 0x3983b8f2UL, 0x757ce2a0UL, 0x835f56f3UL, 0x1502a560UL,
+ 0xd42bd37fUL, 0x91afe2eeUL, 0x673f19a8UL, 0x683bfd6dUL, 0xa8a21a72UL, 0x939eab09UL, 0xc75fda02UL, 0x6d867478UL,
+ 0xffa32a75UL, 0x124a0d0aUL, 0xb2c166d6UL, 0x1f52564dUL, 0x603064e5UL, 0xa11bffe4UL, 0x9edf2be6UL, 0xdb4f4UL,
+ 0x1c4f8d13UL, 0x53080e72UL, 0x16c21f30UL, 0x8b031c9fUL, 0xf487b471UL, 0xb2dcbe15UL, 0xab4f2955UL, 0x2d138332UL,
+ 0x4479045aUL, 0x1f1ea2bcUL, 0x7d492d58UL, 0xce4b5dddUL, 0xb6592d0dUL, 0xd2a9c4b8UL, 0x7a770a59UL, 0xae6e38e0UL,
+ 0x7be26d63UL, 0xcb7f0b33UL, 0x30e5bafaUL, 0xaef5469aUL, 0x8fad1384UL, 0xaf14d32UL, 0x29c36b88UL, 0xa0d8e597UL,
+ 0xebc93167UL, 0x5af62020UL, 0x9e2b5b00UL, 0xf5f88521UL, 0xf066e8edUL, 0xa867c3efUL, 0x4e1304b4UL, 0x6ef4c813UL,
+ 0x2f7e1b98UL, 0x4ed0a95eUL, 0x8224d4cfUL, 0x6e24c1b1UL, 0xa60000aUL, 0x468d9d15UL, 0x17d848a2UL, 0x8709fa5eUL,
+ 0x922b5275UL, 0x9344fa58UL, 0xbd3d851bUL, 0x8cbf2b1fUL, 0xb2f4f37UL, 0x2c1b90fdUL, 0x48f4ec7dUL, 0x402789eeUL,
+ 0xfa62cde0UL, 0x31763e52UL, 0x46f8a563UL, 0x7923eb4fUL, 0xa35eed7UL, 0xd8924507UL, 0x169ad489UL, 0x4ea56b61UL,
+ 0x7e4a7252UL, 0xb8dd1d73UL, 0xdd7d72dfUL, 0xa6665b1dUL, 0x438587d2UL, 0x9577fc51UL, 0x8ff604d9UL, 0xd87caae6UL,
+ 0x68f8d0cbUL, 0x3631284eUL, 0x6d7b482eUL, 0x2c05b8ffUL, 0xeb36b69bUL, 0x39959968UL, 0x6edc4620UL, 0xc2ecd5e9UL,
+ 0x2bbd8149UL, 0xe842bb3dUL, 0x7d423d40UL, 0xfe8bf1b9UL, 0x1034206cUL, 0xf0049c63UL, 0xafbfec7dUL, 0xc31e21afUL,
+ 0xfe7af91aUL, 0x8ab24c1dUL, 0xe5f1d1cfUL, 0x4ed6f8c2UL, 0x81631abeUL, 0x2bbdc8c6UL, 0x39190a3bUL, 0xe786faacUL,
+ 0x5ea72594UL, 0x8c30a77fUL, 0x2ed7287fUL, 0xdaf5a307UL, 0x97b8448eUL, 0x9cc67f73UL, 0x8768cb50UL, 0xd4f87133UL,
+ 0xf526dda9UL, 0x9f5644c8UL, 0x8f686c8fUL, 0x3d40800eUL, 0x20b3588aUL, 0xd8ee7a6dUL, 0x12f54022UL, 0xb4eaed02UL,
+ 0x80d036d3UL, 0x7e5d29dUL, 0x247be4f9UL, 0x861c78d7UL, 0xc4646568UL, 0x2282538fUL, 0x364bd65bUL, 0x5e09308bUL,
+ 0x67fa74ffUL, 0xca5c278fUL, 0xdcabc348UL, 0x9268a80dUL, 0x6374a225UL, 0xd5cbb7cdUL, 0x2e401352UL, 0x658ef868UL,
+ 0xc361da0bUL, 0x15b82e17UL, 0x5581128fUL, 0xb9ea692cUL, 0x5fde6c9UL, 0x359eef8cUL, 0x22f0332aUL, 0x7b17ad9aUL,
+ 0x6bd60d5fUL, 0x531ffda2UL, 0xaca98a75UL, 0x7b51fb17UL, 0x1444ccf7UL, 0x4dfb157eUL, 0xb7d63debUL, 0xc9f08417UL,
+ 0x99ac3c67UL, 0xaf023870UL, 0xd75d7575UL, 0xefbfb5e5UL, 0x993dd715UL, 0xffbb1c69UL, 0x36cf0316UL, 0xb39f4cbfUL,
+ 0x6e314a71UL, 0xb5633b7dUL, 0x29042b1UL, 0x1e13ee39UL, 0x10c88333UL, 0x99a8a0eaUL, 0x704ace6UL, 0x300e6c21UL,
+ 0xdb36505cUL, 0x67bb4071UL, 0x1e28d3d3UL, 0xdc40f0e4UL, 0x3109d643UL, 0x13cee309UL, 0x240a5d2UL, 0x5ee2e6f0UL,
+ 0xa7953968UL, 0x182ac3c2UL, 0x71faf976UL, 0x92b5ce10UL, 0xb1ffc8a7UL, 0x65f479d0UL, 0x412e4e17UL, 0xe838a052UL,
+ 0x744b0b86UL, 0xe21a3ee9UL, 0x5953f6b3UL, 0x3d0defeeUL, 0xdc2f88acUL, 0xf96d3c3aUL, 0x7f327f8cUL, 0x62da3c3dUL,
+ 0xb998aba0UL, 0xa9fcff07UL, 0xac650bdcUL, 0x281126b7UL, 0xa7d7cda1UL, 0xa1c7f620UL, 0x19dd4de6UL, 0xdcf44945UL,
+ 0x66d5052dUL, 0x9c6ff776UL, 0xd9763a9bUL, 0x8a0acea3UL, 0xb2352e4bUL, 0x96ab86e5UL, 0x55cbcbe4UL, 0x7d102af9UL,
+ 0x6a8c3910UL, 0xf38548a4UL, 0x733612d5UL, 0x35d88d6UL, 0x30bea6bUL, 0x39be9a8aUL, 0x143fd482UL, 0x7f1b4cc3UL,
+ 0xc27529e0UL, 0xf31b19e2UL, 0x61953583UL, 0x91760144UL, 0x9c97c52dUL, 0x774252d5UL, 0x33224072UL, 0x3a2abb9bUL,
+ 0x30d20b3dUL, 0x3bf2e0e1UL, 0xb3fddf87UL, 0x8d59512fUL, 0x397dc3bdUL, 0xaababda8UL, 0x8d807356UL, 0xe28623faUL,
+ 0x3e4dfe3aUL, 0x759a7a5eUL, 0x72d305dUL, 0xbbc4b124UL, 0x9e294f93UL, 0x9512470cUL, 0xb6a369dUL, 0x2bdf6f9cUL,
+ 0x1dad86b8UL, 0xeb2952ceUL, 0xe2f303fUL, 0xc68689c6UL, 0x5cd03f59UL, 0xafb287d1UL, 0xd07a4219UL, 0xe4ffd394UL,
+ 0xac4ae455UL, 0x43fecad1UL, 0xd0964907UL, 0x1170e01bUL, 0x4d5c070aUL, 0xa1f9d1e9UL, 0x48f558a2UL, 0x32392083UL,
+ 0xd4953186UL, 0x7c670deUL, 0xc050edf6UL, 0xf2474339UL, 0x7e054273UL, 0x87095d41UL, 0xa7789c67UL, 0x4ad6c591UL,
+ 0xe01123e4UL, 0x6e7c8175UL, 0x3ee3672eUL, 0xaa57b4a7UL, 0xa981ba4UL, 0xb19142fdUL, 0xddbe3910UL, 0x3930eb58UL,
+ 0xd0a1f336UL, 0xab340b6fUL, 0xde88c134UL, 0x6ac295c3UL, 0xe8db5bcaUL, 0x57f860b2UL, 0x9e89178eUL, 0x84e77fc3UL,
+ 0xe87eff8aUL, 0x8493b31cUL, 0x4ab9196aUL, 0xc4aefd6fUL, 0xf8419f97UL, 0xd86706ffUL, 0xf481acbcUL, 0xf4a4301dUL,
+ 0x6d9d5ce3UL, 0x7e79cdUL, 0x7d131171UL, 0xda3a928dUL, 0xb8cd7932UL, 0xab54d48eUL, 0x3f21f9faUL, 0x787a3c89UL,
+ 0x3019b8d2UL, 0xd0e239e7UL, 0x81acf1b7UL, 0x8110c56cUL, 0x2e86ac19UL, 0x57cae3cfUL, 0x6015214cUL, 0x130f6befUL,
+ 0x1bf319cbUL, 0x1ffc3942UL, 0x3279e5fUL, 0x1ec4d85fUL, 0x7bf54c81UL, 0x558a133cUL, 0x4050c08fUL, 0xc148ae7eUL,
+ 0x85752c5cUL, 0xb2119d5cUL, 0xe76e573bUL, 0x47895ba7UL, 0xc712db69UL, 0x928b7738UL, 0x914e8530UL, 0x10bcadc6UL,
+ 0x776b68c8UL, 0x32365abUL, 0xfd4d6628UL, 0x162cc3daUL, 0x30a2f9a0UL, 0x614aeb1bUL, 0xf172f983UL, 0x311a7d5bUL,
+ 0xada7e4adUL, 0x6c64c679UL, 0x5f9a4423UL, 0xe46728feUL, 0xfb5a9204UL, 0xe3edcc0aUL, 0xd39dd5abUL, 0x29df90f6UL,
+ 0x672787c0UL, 0xab02681UL, 0xb0319069UL, 0xfb0afa51UL, 0x7ede14e9UL, 0x9bc8408cUL, 0x60187bf2UL, 0xedff80faUL,
+ 0x96e5789fUL, 0x1d20aef5UL, 0x94f0d5f0UL, 0x89c5d574UL, 0x3433cb65UL, 0xca523ba8UL, 0x5f58ce8eUL, 0x4488f6e2UL,
+ 0x4d3564f0UL, 0x1f46cca6UL, 0x915204b2UL, 0x72aafeb7UL, 0xeb3f1ce5UL, 0xe525b895UL, 0xf26908b0UL, 0xe75b9f1cUL,
+ 0x2c0c7fe2UL, 0xd2db2425UL, 0x421e5588UL, 0x107b9b10UL, 0xe1925d7UL, 0x93a8ea4cUL, 0x67139f12UL, 0x61cdd959UL,
+ 0x5b809149UL, 0x2d1841cfUL, 0x90284751UL, 0xdc5911d8UL, 0x51ccc378UL, 0xc63e57acUL, 0x9f03d140UL, 0x92202511UL,
+ 0x12997d43UL, 0xece2358dUL, 0x2345c788UL, 0x6c3a0a1UL, 0x849ea5c4UL, 0xec10b58cUL, 0x69300c5dUL, 0xca276a34UL,
+ 0x68a04c03UL, 0x7ff5b052UL, 0x72df8f9aUL, 0xf5a392b5UL, 0x84796a36UL, 0x38b81197UL, 0x29e8abaaUL, 0x5772f3f4UL,
+ 0x62d443ccUL, 0x1c1d0700UL, 0x42917b94UL, 0x4ad58387UL, 0x15badffcUL, 0x1906cc8bUL, 0x48a2b40UL, 0xc262925UL,
+ 0xa85af9f8UL, 0x8bb20cd4UL, 0x68d939a1UL, 0xb6748446UL, 0xe0c38ba9UL, 0xf6aa362dUL, 0xa0d8b7aeUL, 0xb901da5UL,
+ 0x61701acfUL, 0x4258809bUL, 0xf6fcee0dUL, 0xc08b4e02UL, 0x77f058bdUL, 0x7c47a7e1UL, 0x6380ee0UL, 0xf6aa20f5UL,
+ 0x5bc2138aUL, 0x1554efb6UL, 0x3ba9bf70UL, 0x8a8a815UL, 0x6f7c7282UL, 0x3278aeafUL, 0xff145682UL, 0xe9a0eec0UL,
+ 0xf6d2a556UL, 0x71794915UL, 0x7d9bf7c2UL, 0xc9cff620UL, 0x23fa79e8UL, 0xfbd0fb8eUL, 0x7728d830UL, 0x85a9180fUL,
+ 0x34d442e2UL, 0x4ac938cbUL, 0xc2ac1cacUL, 0xc4acf0cbUL, 0xcd4326bfUL, 0x8060a95dUL, 0xd3c08ee2UL, 0xf8fd8e12UL,
+ 0x387a1f9dUL, 0xda8432b7UL, 0xfc54e2cUL, 0x877dad0aUL, 0x25ed0702UL, 0x5d0884e2UL, 0xc902fa31UL, 0x3d1e28acUL,
+ 0xba0e87e0UL, 0x48a75921UL, 0xb16b5c5fUL, 0x28b2148UL, 0xa16d6673UL, 0xc61ead8fUL, 0x7ad0132eUL, 0x5a4d2ffUL,
+ 0x49ebc3c2UL, 0xc666ef29UL, 0x2cdf199fUL, 0xb2ee732fUL, 0x43ce304UL, 0xb268d1e6UL, 0xe75c2836UL, 0x310935adUL,
+ 0x609ff2c9UL, 0x95f8f0dfUL, 0xff517441UL, 0xa2a92b95UL, 0x6fca9aceUL, 0xd72e9bbfUL, 0xb9f3c2UL, 0x57ffacadUL,
+ 0xd49a8ab9UL, 0x7d849bfdUL, 0xef6b9a35UL, 0x8e9930aaUL, 0x8bea615UL, 0x3bdc603fUL, 0xe162b1dfUL, 0x9d9bed6fUL,
+ 0x1342a9eaUL, 0xf2e188bdUL, 0x63c243b5UL, 0x4ba409f5UL, 0xe79f8bf6UL, 0x62d4bc5eUL, 0x87872b2fUL, 0x3ed3f28UL,
+ 0x61bd34d0UL, 0xae5cb9e5UL, 0xe95e3b49UL, 0x26a539aUL, 0xc1b6cb18UL, 0xbbe40596UL, 0xa82b4c2fUL, 0x304c7700UL,
+ 0xece7c114UL, 0x78ffa071UL, 0xd305dc1UL, 0xf4165ed8UL, 0x72a4703fUL, 0xfbbfe496UL, 0x8d91ebf2UL, 0x360f23dcUL,
+ 0x302e6516UL, 0x48e2929aUL, 0x23783708UL, 0xbcc7dd83UL, 0x4c298d7eUL, 0xec7bd815UL, 0x3d2dcf38UL, 0xe7143acbUL,
+ 0xcd68beffUL, 0x546cabfbUL, 0x610cd4ceUL, 0xebf0e995UL, 0x45583585UL, 0xf2765d25UL, 0x31758de7UL, 0xc64514c2UL,
+ 0x28283d7cUL, 0xe65b69a1UL, 0x795717caUL, 0x5ff73da5UL, 0xaef8582aUL, 0xa14bfd85UL, 0xe00e4331UL, 0xe4a64ae3UL,
+ 0xf7fd0029UL, 0xc080d145UL, 0xf8a4536dUL, 0xfc137448UL, 0x8d6bb16fUL, 0x4f157169UL, 0x5540114UL, 0xb0dd76d4UL,
+ 0xbc876d42UL, 0xfad0a7eaUL, 0x249db741UL, 0xd5bcd8d9UL, 0x55c9395dUL, 0x53bb6f5fUL, 0x23206961UL, 0xf863c46dUL,
+ 0x9dd908c1UL, 0xe58376ceUL, 0x6116a21UL, 0x315a2087UL, 0xc98a2f03UL, 0xf2b24cf2UL, 0x3d20c088UL, 0x661707bcUL,
+ 0xf34ae80aUL, 0x1db1f185UL, 0xcbb09417UL, 0x17816b73UL, 0x83a06943UL, 0x7e8ecb46UL, 0x2a34d2ccUL, 0x66d46cedUL,
+ 0xa2ae3769UL, 0xfa0bfd80UL, 0x86e65d32UL, 0x1238e11eUL, 0x5436c310UL, 0x568aa6deUL, 0xcc91ce32UL, 0x75929192UL,
+ 0x3967230fUL, 0x524a8f57UL, 0x4632ab58UL, 0xf318a634UL, 0x923180ccUL, 0xa7285055UL, 0x442857faUL, 0xa043bf7dUL,
+ 0xca902613UL, 0x6042e4d4UL, 0x856bcc6eUL, 0x8296dac1UL, 0x402cbfebUL, 0xdb954d2cUL, 0xaa678c5eUL, 0xc613f823UL,
+ 0xc1b45344UL, 0x269a96efUL, 0x6ee96b06UL, 0x36832f9eUL, 0x10b9bf33UL, 0x95518253UL, 0x45ad859dUL, 0x427fd8f2UL,
+ 0xa637579cUL, 0x9621a7ffUL, 0xc463bb47UL, 0x39a05c65UL, 0xb07fd3bdUL, 0x75d5e41cUL, 0xfa2358f6UL, 0xd29939a2UL,
+ 0x6100f9aUL, 0x3401b977UL, 0x98259062UL, 0x50cb8936UL, 0x2e53777dUL, 0x8a30e736UL, 0x8cc31ef0UL, 0xddfbb943UL,
+ 0x15eca260UL, 0x9ed84997UL, 0xdde6931aUL, 0x5e603e71UL, 0x620c6038UL, 0x41e22c84UL, 0x6d533aceUL, 0x76fc5aadUL,
+ 0x2d7fc924UL, 0x60c510f3UL, 0xf3804c5aUL, 0x5222f5d0UL, 0xed06a26dUL, 0x551ea2cfUL, 0xb6a6874fUL, 0x27163766UL,
+ 0x8fd248c8UL, 0x65d40db8UL, 0xb3f5c4fbUL, 0x5c033426UL, 0x9c934542UL, 0x11624b38UL, 0xed6abaaaUL, 0xe1050abUL,
+ 0x8515ec3aUL, 0xd0ec653eUL, 0xcb59c67UL, 0xd71f9c6eUL, 0x6ec47675UL, 0x92ee0aa5UL, 0xc4716765UL, 0x4295c89cUL,
+ 0x44d5e3f9UL, 0x3175b7bdUL, 0xefb5a16dUL, 0x8d48848UL, 0x4a02af8dUL, 0x546c1783UL, 0xdc01c598UL, 0x80a35489UL,
+ 0x722f9162UL, 0x2291d1f3UL, 0xf102b2dfUL, 0x4248cc23UL, 0x25bd9d7UL, 0xc092ea06UL, 0x44ed1261UL, 0xe16b324dUL,
+ 0x320caf1UL, 0x2a4356eaUL, 0x7b95b116UL, 0x287e952dUL, 0x66ebb0a2UL, 0x1ad8e1f1UL, 0x3a619095UL, 0xf9146cfaUL,
+ 0x78886f2bUL, 0xe346e6b3UL, 0xa3c71d18UL, 0x941718ecUL, 0x8ffe84c4UL, 0x4c6c9029UL, 0x5c158c57UL, 0x8b8fb020UL,
+ 0xe577d9d3UL, 0xfc7eba83UL, 0x997d18f6UL, 0x2cfef02bUL, 0x9881d629UL, 0xd8aab6a9UL, 0xfde2b447UL, 0xebd3f330UL,
+ 0xa3e6a365UL, 0x2c5df8c6UL, 0xbd87899aUL, 0xd8a7bbddUL, 0xb036b09UL, 0xac5eca94UL, 0x23968bfUL, 0xf67b1635UL,
+ 0x9482b67eUL, 0x5d6717a1UL, 0x6d4ba255UL, 0xf2a1c8cdUL, 0x5067d48bUL, 0xd4d6afe4UL, 0x48b5e3cdUL, 0x2d639446UL,
+ 0x451f740UL, 0xd95cd6dbUL, 0x3b122ed9UL, 0x41d177ceUL, 0x9e4b4ebfUL, 0x4a26fac7UL, 0x2e76f5cdUL, 0x1cf841efUL,
+ 0x198e8e8aUL, 0xfceaf70bUL, 0x92f46d97UL, 0x26953721UL, 0xf9677fddUL, 0x8307fdd5UL, 0x55bcf13dUL, 0xec27c8c9UL,
+ 0x30031e9aUL, 0xd0a5a1e3UL, 0xb0e3a1d5UL, 0x1a35d203UL, 0xfbcdf22dUL, 0x2a4c556UL, 0x33dd8fdcUL, 0xa4923266UL,
+ 0xf36682e8UL, 0x1315d3a0UL, 0xbea09e96UL, 0xd087d595UL, 0xd13385e7UL, 0x994ddeeeUL, 0x32155e2eUL, 0x37ab379fUL,
+ 0x905660a4UL, 0xfd12dfaaUL, 0xdc3d45deUL, 0x68db56e7UL, 0xf4633161UL, 0x87d4aed1UL, 0x96e5fab9UL, 0xbf7c0141UL,
+ 0x4b771866UL, 0x1102df7bUL, 0x8d658f0dUL, 0x3e8fa7c8UL, 0x4062ff0eUL, 0xe513abb1UL, 0x43a0d0afUL, 0x5908de67UL,
+ 0xeb07ad42UL, 0xc2171a7bUL, 0x9ae3fad8UL, 0x5722ff11UL, 0x3c55da44UL, 0x5fa74db1UL, 0x3a649242UL, 0xeb38a0c2UL,
+ 0x5d211e50UL, 0x98632880UL, 0xa872b720UL, 0xa969dc66UL, 0x9badb45aUL, 0xe81374c9UL, 0x72018c6UL, 0x58ff57a0UL,
+ 0x92984ce2UL, 0x9589c25dUL, 0xe1862067UL, 0xe1bb6100UL, 0x9be7004UL, 0x7ea23c2bUL, 0x74c9529eUL, 0x94d24637UL,
+ 0x454a533eUL, 0xca4aa07dUL, 0x6972fd68UL, 0x628a458bUL, 0x9bdf4a1aUL, 0x5dc132d3UL, 0x9a59640UL, 0xc4c41908UL,
+ 0x30707a77UL, 0x1794d70eUL, 0x5045089fUL, 0x8f4e33c8UL, 0xa421bf18UL, 0x4429d1a2UL, 0x3d7fd09cUL, 0x12f2296aUL,
+ 0x337372a7UL, 0xbf1b7931UL, 0xad89c35eUL, 0x1dfb7554UL, 0x6f8c653UL, 0x4f253cc3UL, 0x89c0916dUL, 0xeb2bfe24UL,
+ 0x438c5b85UL, 0xb23c1716UL, 0xa72653b4UL, 0xcbe8886eUL, 0x16c0bbf9UL, 0x92608326UL, 0x71434495UL, 0xdf9094f7UL,
+ 0xb6b430beUL, 0xd854faaeUL, 0xc5908d0bUL, 0x56e8a048UL, 0xf245b736UL, 0xeb55b153UL, 0xa897162bUL, 0x5317df0dUL,
+ 0x963e94ceUL, 0x19d9c32dUL, 0xeb09e2ddUL, 0x1f28a6aUL, 0x284a491fUL, 0x3009cf49UL, 0xbc4ea6a4UL, 0xdc5b9806UL,
+ 0x6dd6dfe0UL, 0xaa1255acUL, 0x8a8fc8d8UL, 0xca4451aUL, 0xbd466069UL, 0x85ccb564UL, 0xbd2fe70bUL, 0xb035876dUL,
+ 0x929ead36UL, 0x74f1f26aUL, 0xb852f545UL, 0x720b45daUL, 0xe39c817aUL, 0x833c0d0UL, 0x81600f7bUL, 0x2c5f3fd1UL,
+ 0x8bef340eUL, 0xed08fd7UL, 0x384e8071UL, 0x3a0810b4UL, 0x9a7d6581UL, 0x944a8097UL, 0x1fb23993UL, 0x49d1f11fUL,
+ 0x8d271787UL, 0x21e8a59cUL, 0x29171d1aUL, 0xf5e33ae5UL, 0xc7deee82UL, 0x18c1a7c9UL, 0xe63de4d9UL, 0x6755edfdUL,
+ 0xca36688dUL, 0x808fab6cUL, 0xb8c7bbaeUL, 0x95daaf9fUL, 0x65e94e5UL, 0xd0782a8dUL, 0xfc640082UL, 0xbd3fe471UL,
+ 0xa4107b45UL, 0x4ee5da2eUL, 0x9a5c669cUL, 0xf65c554cUL, 0x24963123UL, 0x364a3633UL, 0x67bae25fUL, 0x3625ab3dUL,
+ 0xc377d063UL, 0x42fe8860UL, 0x7d6e7e9cUL, 0x830ba19cUL, 0xae4e7adeUL, 0x9435ed40UL, 0x72add5eeUL, 0x7a5847a4UL,
+ 0x3bc2ef95UL, 0xb7318b36UL, 0x641e2b1aUL, 0xdf3efeUL, 0xeeacb296UL, 0xb9b851f1UL, 0xed77679cUL, 0xbfdba455UL,
+ 0xd5e9a35UL, 0x14497549UL, 0x7a43748fUL, 0xfa9a4316UL, 0xc324a173UL, 0x502e1497UL, 0x27be3990UL, 0xffef3dc9UL,
+ 0xb29fcfb5UL, 0x39ae8f67UL, 0x7ee978fdUL, 0x74080782UL, 0x8951d398UL, 0xaba22217UL, 0x5544fc4dUL, 0x880f03c9UL,
+ 0x42c7bc2fUL, 0x1a1a6765UL, 0x86c89c73UL, 0xd16eeabaUL, 0x409ca8fbUL, 0x47b6ddeUL, 0x9d4fc327UL, 0x5ba2ebdbUL,
+ 0xdf061db2UL, 0xa76368c0UL, 0xf3ffb02cUL, 0x782f7d6aUL, 0xe015c602UL, 0xa226a3f9UL, 0xa24abfeeUL, 0x9784a9f8UL,
+ 0xc8c9a1dUL, 0xa58e3c17UL, 0x769086e9UL, 0xe6fdd4fdUL, 0x81ad2980UL, 0x96de7ac0UL, 0x41a1f2c4UL, 0x17c32993UL,
+};
+#else
+static const mp_limb_t ecc_unit[8] = {
+ 0x1UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+};
+static const mp_limb_t ecc_table[4096] = {
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x1UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x9e9f1e14UL, 0x22acc99cUL, 0xdf23e3b1UL, 0x35294f2dUL, 0x453f2b76UL, 0x27df505aUL, 0xe0989cdaUL, 0x8d91e471UL,
+ 0x6640f110UL, 0x6836c0b7UL, 0x9a30d10bUL, 0x60ddf288UL, 0x91c22bb3UL, 0x853d8fe3UL, 0x6830bd12UL, 0x5b9ce67cUL,
+ 0x8edabed3UL, 0xc19956a9UL, 0x2d90df5cUL, 0xc9b46918UL, 0x7f1ad50dUL, 0x562d0427UL, 0xffd24011UL, 0x30b84053UL,
+ 0x54ab33a5UL, 0xf909ba0dUL, 0x22f55287UL, 0x409a5847UL, 0xaea6a078UL, 0x9f600f87UL, 0x6a83efcaUL, 0xc2b90ce4UL,
+ 0x17cc5b17UL, 0xdc3c26a2UL, 0x117f0c65UL, 0x66597a08UL, 0x46c685f6UL, 0xf58e17d0UL, 0xf97118d8UL, 0xe6f681acUL,
+ 0x33d17d71UL, 0x263343b1UL, 0xe8fd0648UL, 0xf58a611UL, 0x1fc24509UL, 0xf361fc63UL, 0xb568f30aUL, 0x4e4d7c57UL,
+ 0x9aeb8233UL, 0xa7fb2c3cUL, 0x8220438bUL, 0xc483a015UL, 0x94e49355UL, 0x18a802ffUL, 0xe109faf0UL, 0xbaf075bbUL,
+ 0x950a6b00UL, 0x87a19dbUL, 0x1a519e50UL, 0x31247adUL, 0x858b1331UL, 0x92b89a9aUL, 0xa7d92af4UL, 0x8a869a44UL,
+ 0x938c5148UL, 0xfd2bb274UL, 0x8bc4a48eUL, 0x68a97677UL, 0x1d152f52UL, 0x690b8edaUL, 0x9840e06cUL, 0x8e919f6fUL,
+ 0x2d0912f9UL, 0xd56ebcd1UL, 0xa1ca297cUL, 0x6d035c2UL, 0x10bebc61UL, 0x71db5b98UL, 0x3979deb4UL, 0x7dac7447UL,
+ 0x3ab7e378UL, 0x9ccfe824UL, 0x9320ec6UL, 0xb9f3a562UL, 0x6bd51812UL, 0x79358a85UL, 0x3c19dffdUL, 0x10bb1783UL,
+ 0x2b3ec296UL, 0xcddb3d1eUL, 0xbb0215beUL, 0xbf91ec26UL, 0xc29dd720UL, 0x40d48feeUL, 0x93ec380dUL, 0x27e84f68UL,
+ 0x85ff8188UL, 0x80bd016cUL, 0x914713c8UL, 0xaecdb42dUL, 0xca4daf7cUL, 0x2655130aUL, 0x8f4c7a84UL, 0xc1197a8dUL,
+ 0x6f96023bUL, 0x4314c20UL, 0x6252f279UL, 0x981074daUL, 0x8687d127UL, 0xf686b86dUL, 0xad0dd14cUL, 0xed44d10cUL,
+ 0x30027580UL, 0xc5d34dfaUL, 0x6e56007bUL, 0x63b88d69UL, 0xfdab8fbUL, 0xbe451a28UL, 0x4333eb06UL, 0xfce982d7UL,
+ 0xd51bbc1cUL, 0x9cd393c5UL, 0x87b6d93aUL, 0xf48749d3UL, 0xd880a9c5UL, 0xfdd7e52fUL, 0xb380f50aUL, 0x1bbfebf2UL,
+ 0xf15d6669UL, 0x90ce9525UL, 0x66723c15UL, 0xe29dc720UL, 0xc430a6c3UL, 0x592a0be7UL, 0x1436f3e3UL, 0x169c2146UL,
+ 0x66295fecUL, 0x8eb43fbbUL, 0x20d7dbf8UL, 0x87c95806UL, 0xca7c7029UL, 0x50116efdUL, 0x57a902d6UL, 0xfb68a016UL,
+ 0x8ee4d63cUL, 0x98c2f2beUL, 0xda53fc95UL, 0x73fd7c3cUL, 0x1713070aUL, 0xc73d52d0UL, 0x83c4698aUL, 0x7cc15cfdUL,
+ 0x77f61191UL, 0x985512b5UL, 0x96cb867eUL, 0xdee1d090UL, 0xbdaacbefUL, 0xb4e3ffa5UL, 0x2feecefaUL, 0xeabac5dcUL,
+ 0x8695b262UL, 0x3af3fec0UL, 0xc85e58aaUL, 0x2357c7a1UL, 0x973b0561UL, 0x1ec15e86UL, 0x7aa4b8d7UL, 0x724e9c89UL,
+ 0x45a5b2a7UL, 0x5cc3e800UL, 0x298ae7e3UL, 0x556c5705UL, 0x85771b94UL, 0xdc68e514UL, 0x4a6b0571UL, 0x26842e6UL,
+ 0x740ef20eUL, 0x26ae43eaUL, 0x49267318UL, 0x6d1efdb8UL, 0x5895348dUL, 0x62b4cb31UL, 0x27c7fedcUL, 0x21341cccUL,
+ 0x4c4cd704UL, 0x6097110eUL, 0xfd154eadUL, 0x4a2d40feUL, 0x810a4366UL, 0xa3f29a1dUL, 0x52265c0dUL, 0x27756ea8UL,
+ 0x7a431511UL, 0xfacff471UL, 0x62903aa5UL, 0xbc67450dUL, 0x8d44557eUL, 0xdcfdc317UL, 0x5cd59a38UL, 0x4593ed11UL,
+ 0xf9e38b80UL, 0xe98f0ef9UL, 0x43e853fcUL, 0x71ddf097UL, 0x620f53b2UL, 0x42153406UL, 0x73b5492dUL, 0xb3c15d93UL,
+ 0xda48ad4cUL, 0xd182a531UL, 0xc2077c85UL, 0xf068ab3aUL, 0x9b36b50eUL, 0x1270f1b9UL, 0xea148149UL, 0x41b544faUL,
+ 0x163ceef2UL, 0x79422cb9UL, 0x66627757UL, 0xab58bfd5UL, 0x9eef2756UL, 0x1cc0e43UL, 0x1eaef1ebUL, 0xd44a63d9UL,
+ 0x229a5e95UL, 0xe192f611UL, 0xeb9118f9UL, 0x85f6f05bUL, 0xa1865f90UL, 0xba519b23UL, 0xef9e55cbUL, 0x17366cddUL,
+ 0xbabc2544UL, 0x1a7a6070UL, 0xdb75997bUL, 0x5f54e061UL, 0x3a09774eUL, 0xf77e6888UL, 0xd63692d0UL, 0xdaa30467UL,
+ 0xe65a41afUL, 0xd4ed64d4UL, 0x2182b1deUL, 0x71a915caUL, 0xe4f11454UL, 0xded7512fUL, 0x4c148cd5UL, 0xe2d9e2eeUL,
+ 0xb3db55dfUL, 0xc484fa9fUL, 0xb2026709UL, 0xc62dd13bUL, 0x64183ca2UL, 0x59831847UL, 0xb3f4670eUL, 0x4593bc37UL,
+ 0x5fdc0ce9UL, 0x5dcd553fUL, 0x13995bd4UL, 0x25350f94UL, 0x90695b02UL, 0x3b29a7fbUL, 0x869ea460UL, 0xc3ca63f3UL,
+ 0x2ea0852eUL, 0xb7ff7f8bUL, 0x71ca5679UL, 0x4e10b75aUL, 0xaccb9cb2UL, 0x10c4fc89UL, 0x2cb4c1deUL, 0xb2d8b012UL,
+ 0x5d7f9a23UL, 0x9718c49aUL, 0x8ae1f23bUL, 0x5f899773UL, 0x76671699UL, 0x1d535e12UL, 0xce0e39a7UL, 0xecdc56fbUL,
+ 0xc2b7f949UL, 0xb7b1192fUL, 0xd9ce4e01UL, 0x6406b181UL, 0xf1160f3dUL, 0x5d1e8513UL, 0xfbc2c189UL, 0xc0408fecUL,
+ 0x5b216af8UL, 0xffd4f285UL, 0x2cf54880UL, 0x7e9add75UL, 0x996df4e2UL, 0x1b6c3a96UL, 0x8d61abe2UL, 0xc11fb2a8UL,
+ 0x293c9acdUL, 0x5b073a13UL, 0xdf403ba1UL, 0x651fd18dUL, 0xb1a662d0UL, 0xb410a6b3UL, 0xc0f38532UL, 0x9c161017UL,
+ 0x111b02fcUL, 0x7ae02cb4UL, 0x82d64cfcUL, 0xd5c4086eUL, 0xe6427f3UL, 0x96642b0cUL, 0xa3eff240UL, 0xe22c7524UL,
+ 0xbcecb61aUL, 0x2ddcc1acUL, 0xaa6262c5UL, 0xb341d0c1UL, 0xf18ec4f6UL, 0x7ea2fd33UL, 0x4b48c715UL, 0x3370026aUL,
+ 0x24eece34UL, 0xe15e004fUL, 0xfe4517f1UL, 0xbd8c309cUL, 0x4bf00709UL, 0x86fccb0fUL, 0x1978e7fdUL, 0x677a57d8UL,
+ 0xd209a0d9UL, 0xd6d31749UL, 0xb8780085UL, 0xcb3f257eUL, 0x437a0418UL, 0xcf909705UL, 0xb3924e16UL, 0xdd7c16e6UL,
+ 0x2867d320UL, 0x2901db95UL, 0x2641750bUL, 0x444e1169UL, 0xcfe3396cUL, 0x91d129b1UL, 0xf1334e68UL, 0xec9b929fUL,
+ 0xc40cd627UL, 0xb1494c26UL, 0x47226a06UL, 0x565b3699UL, 0x811ed914UL, 0x10e27ea4UL, 0xab25cd3fUL, 0x1ec2fa6aUL,
+ 0x4376d74bUL, 0x2d34f495UL, 0xb0f04578UL, 0xfcdba73aUL, 0xec660c08UL, 0x33801d8bUL, 0x174754b0UL, 0x616fbc01UL,
+ 0x8c480b4dUL, 0x9bca16b2UL, 0xf790b3abUL, 0x7d62c01bUL, 0x1c5a0589UL, 0x4837315eUL, 0x6d8a3ec7UL, 0xc5a6240aUL,
+ 0xe5039ee1UL, 0x8b2440f5UL, 0xed6d1173UL, 0x72d5ef7cUL, 0x24e016a6UL, 0xe35d8545UL, 0x51c3a99eUL, 0xbb5a9b70UL,
+ 0x4470b8b5UL, 0x2709cd1dUL, 0x6e138a20UL, 0xa958d74eUL, 0xb563097aUL, 0xddd7ebe9UL, 0x2bb891eUL, 0x3d040b16UL,
+ 0x2693ca30UL, 0xea49be60UL, 0x18527a8aUL, 0xfc56098eUL, 0xf066e779UL, 0x5db5c832UL, 0x6ec094c5UL, 0xc3fc8bf9UL,
+ 0xd9f91ec4UL, 0xc58d2007UL, 0x63461171UL, 0x4e96cebdUL, 0xc520bd2bUL, 0x907cad4aUL, 0x214ecf7aUL, 0xc2d8d7c5UL,
+ 0x8a469e07UL, 0x23fd6819UL, 0x3083dd0bUL, 0xac7ff458UL, 0xe9c2aeceUL, 0x7b10ead7UL, 0x9e7cd3c1UL, 0x34c2cd74UL,
+ 0x9991e029UL, 0x4f85a7a5UL, 0x6e8d639cUL, 0x9b385685UL, 0xe14fce4dUL, 0x35c85261UL, 0x9f7a17abUL, 0xa3a9b343UL,
+ 0x5621c1d7UL, 0xaa74eb65UL, 0xddccd489UL, 0x90a5677bUL, 0xdf03a11eUL, 0x7c04914bUL, 0x753ee1d3UL, 0xe4960d8UL,
+ 0x52014010UL, 0x6c1c196fUL, 0xa5f297e5UL, 0x1a22eb5dUL, 0x3b593e29UL, 0x7a2e8f2bUL, 0xbce8b8aaUL, 0x43c77ccaUL,
+ 0xaf2cf081UL, 0xa03847b9UL, 0x8d33c5e6UL, 0x3ded21a8UL, 0x43899c6cUL, 0x66590d76UL, 0xb76078f1UL, 0x17cd5e9aUL,
+ 0x2c601f09UL, 0x8caa75b7UL, 0xedb29484UL, 0x2e8da9bUL, 0xf5186cd5UL, 0xee83ba21UL, 0xbc7cd177UL, 0x55b16f1UL,
+ 0x2718d360UL, 0xd794057UL, 0x83bc7946UL, 0x27028bfbUL, 0x2f24725fUL, 0xeeddef97UL, 0x47e1a9fUL, 0x7d34e154UL,
+ 0x810349edUL, 0x812f31e1UL, 0x82141427UL, 0xc86f6e95UL, 0x30456bfeUL, 0xdc612592UL, 0x4c72f47bUL, 0x833c123UL,
+ 0xefece34dUL, 0xd4d4d082UL, 0xc503bf94UL, 0xbc07020fUL, 0x460ace22UL, 0xba600febUL, 0xc4ccf87bUL, 0x6f45bba6UL,
+ 0xa88af25fUL, 0x466b693cUL, 0xc8b03bf0UL, 0x19b6b895UL, 0xb2226804UL, 0x523f21dbUL, 0x9eb6baf1UL, 0xa7464df6UL,
+ 0x4675c91bUL, 0x6470c902UL, 0x257df0faUL, 0xf56ff94UL, 0xdfd92170UL, 0xea08fc23UL, 0xdc014a4cUL, 0x3e5410e7UL,
+ 0xbe38b996UL, 0x58ea2cccUL, 0xc4879dd8UL, 0xc5fc939cUL, 0x72e225ceUL, 0xecdef836UL, 0x35a2e6a7UL, 0x41fd079cUL,
+ 0xee2c6327UL, 0xe224d60UL, 0xe84b5494UL, 0x59c19ffaUL, 0x80f31046UL, 0x278fa360UL, 0x4f024f2bUL, 0x3547d3abUL,
+ 0x94ae2043UL, 0xdf11d251UL, 0x10e36090UL, 0x2b836479UL, 0x2b89925UL, 0xc7cee947UL, 0xf3c79f48UL, 0x2e54114eUL,
+ 0x7bcaa28cUL, 0x31a6e7beUL, 0xe6b0aa73UL, 0xc5dbe8cUL, 0x660defa5UL, 0xf0c8e902UL, 0x6178bb9fUL, 0xf4b830d2UL,
+ 0xac6511f8UL, 0xe3aaf927UL, 0xc9f0e2dfUL, 0xa97e21d0UL, 0x33ed1acdUL, 0xdd51e86dUL, 0xed72f729UL, 0x1690e28UL,
+ 0xc522a944UL, 0x95e46a3eUL, 0xebc04a06UL, 0x27b0f9ccUL, 0x2a4857a4UL, 0x5ea0a6dUL, 0xbc210d61UL, 0xf5571162UL,
+ 0x2530551eUL, 0x895a98acUL, 0xdbc7c701UL, 0x316f9d06UL, 0x8ed29449UL, 0x18fd92faUL, 0x1e73ae26UL, 0x82a2fa7aUL,
+ 0xe7ec4068UL, 0x2020bea0UL, 0x47c82364UL, 0x901d0a5fUL, 0x69e35109UL, 0x86ec99baUL, 0x908c799cUL, 0xec07b1f8UL,
+ 0x7d8d0e84UL, 0x67ba38bbUL, 0x79b8bb49UL, 0xd8807ce0UL, 0x74ea39efUL, 0xe5ae77e4UL, 0x553bf9d8UL, 0x37e3f781UL,
+ 0xb1dbe6e9UL, 0x5338a0eUL, 0x20b5e950UL, 0xf6e5d367UL, 0x6166f4fcUL, 0x5ecf8e3bUL, 0xb3dae2c5UL, 0xb81a9a1bUL,
+ 0x9559e94aUL, 0xc6b77c78UL, 0x77db39bdUL, 0x99e16dbeUL, 0x73f9f52bUL, 0x57231d7aUL, 0xbb414a27UL, 0x37c59b95UL,
+ 0x22a0fb21UL, 0x65e468dUL, 0x75ad1656UL, 0x580540afUL, 0x86b99783UL, 0x7f4868b9UL, 0x49cddf28UL, 0x212779deUL,
+ 0x5bcbc0e9UL, 0xd26499b7UL, 0x9e115ed4UL, 0x44c9bce3UL, 0x7b9b04e7UL, 0x1257f387UL, 0x5e48c2f9UL, 0xb3596277UL,
+ 0xe6b0d2dfUL, 0x626745aUL, 0xf1c930e3UL, 0x10ddc1eUL, 0x90a73a8UL, 0x44e1ec6eUL, 0x3eca96f8UL, 0xfe2b530aUL,
+ 0x6683e34UL, 0xa43fd742UL, 0x4e2955eaUL, 0xe6578910UL, 0x12544467UL, 0x7602f45fUL, 0xf85b3f45UL, 0xad55404fUL,
+ 0x2a563772UL, 0x8b06ebf3UL, 0x2f959f44UL, 0xde3ad7b3UL, 0x871b60a1UL, 0x81d895a8UL, 0xd93ea59bUL, 0x70827794UL,
+ 0x23536f5dUL, 0x52691de0UL, 0x8243e7f7UL, 0xc4952520UL, 0xb0762307UL, 0xede00c51UL, 0x2620c4d8UL, 0x241e5dddUL,
+ 0x761abb9bUL, 0x166f39cbUL, 0x3d9d6905UL, 0x5b436becUL, 0x99c3609aUL, 0xe1003b6bUL, 0xa66680bcUL, 0xe44eaa5fUL,
+ 0xe52dcc23UL, 0xdb9842dfUL, 0x3f91db90UL, 0xd1426fdeUL, 0x48d826a4UL, 0x77947100UL, 0x30fca163UL, 0xa7ce99eUL,
+ 0x17448896UL, 0xed717852UL, 0xb3f856baUL, 0xddf14e48UL, 0x23a45f60UL, 0x8037dec0UL, 0x532b3e66UL, 0xe2d16df7UL,
+ 0x60c9150dUL, 0xa7742c2UL, 0x4631ba6cUL, 0x5a1b416UL, 0xed1b7346UL, 0xd2a5dac0UL, 0x89bfcf87UL, 0xc67ba7e2UL,
+ 0xc52b721cUL, 0xb7d401c1UL, 0x1491f07aUL, 0xcc4062c2UL, 0xd4274b1dUL, 0x99c8f147UL, 0xc47880b1UL, 0x4c4bacddUL,
+ 0x576d42b4UL, 0x174e49bfUL, 0x451899b3UL, 0xfe5f8760UL, 0xd17ec0e1UL, 0x903f1a81UL, 0xd7cb2ad2UL, 0x3f3a1f34UL,
+ 0x1c76937cUL, 0x3a88bd5fUL, 0xdceab919UL, 0x4b8157c4UL, 0x3f0ee857UL, 0x3c2d00b7UL, 0x909eeebcUL, 0x7953912cUL,
+ 0xcb991ae9UL, 0x868d23aeUL, 0x1fb0e21UL, 0xd05c2009UL, 0x5be63e28UL, 0x17f53287UL, 0xe3dc286UL, 0x59badb61UL,
+ 0xb33bbc4eUL, 0x753deec2UL, 0xc814e179UL, 0xcb4d01dbUL, 0xc8ea72ecUL, 0x2f0e5cc1UL, 0x6b008874UL, 0xd26c656dUL,
+ 0x9419f652UL, 0xe79d85a0UL, 0xca19903aUL, 0xc9c0c574UL, 0x2be3d9fbUL, 0x9ab53175UL, 0x5a5dd877UL, 0xbf2b69b5UL,
+ 0x4a8451d8UL, 0xcdf82015UL, 0xa995795dUL, 0xc172f1fdUL, 0x643078c7UL, 0x371c030bUL, 0xa6442800UL, 0x44a9241aUL,
+ 0x1b463de4UL, 0x6d330db2UL, 0xe46070d0UL, 0xa323adc4UL, 0x6c0080b5UL, 0x1fc54fecUL, 0x55026b79UL, 0xd1fa77d5UL,
+ 0x424a311UL, 0x8e8e9c1eUL, 0xb924b1d0UL, 0xb59c6fbeUL, 0x1f0d524aUL, 0xca37ac19UL, 0x6411c011UL, 0xa86d43c9UL,
+ 0x50beed4bUL, 0xd7f5d90UL, 0x1fe45082UL, 0x1d62c2b2UL, 0x5ca194a7UL, 0x86ceb3fbUL, 0xe04a581fUL, 0x19aeb622UL,
+ 0x9ca35251UL, 0x7ada5b89UL, 0x80d42c9eUL, 0x40e424e7UL, 0x75f3c65eUL, 0x3117a4daUL, 0x54496986UL, 0x68e447ddUL,
+ 0x74d09e3bUL, 0x27ff5e9bUL, 0xd1c0964bUL, 0xb4dade6cUL, 0x182b53ebUL, 0x604a983UL, 0xf41dde76UL, 0x216c5409UL,
+ 0xa6eba4d2UL, 0xabd9e58dUL, 0x4a151a63UL, 0x93d45b0UL, 0x65abf22dUL, 0xd09a7298UL, 0xa19a4a27UL, 0xb32b9757UL,
+ 0x6b89244dUL, 0x13676187UL, 0x409a7b36UL, 0x6960e5c3UL, 0x88a5652eUL, 0xadbf33d5UL, 0x251daf9eUL, 0xbe345840UL,
+ 0x381f2a17UL, 0xe1c44656UL, 0x7699e53fUL, 0xafb0d78eUL, 0x9844cbe8UL, 0x3f962dd9UL, 0x9bddb070UL, 0x8be3c114UL,
+ 0x2b295e49UL, 0x2c02f8f7UL, 0x2c9b4ebdUL, 0x6425131eUL, 0xf6c163daUL, 0x6c2ec910UL, 0xd88f2a66UL, 0x43f22556UL,
+ 0xbe2785c6UL, 0x188fa790UL, 0x85f0995cUL, 0x7ee7934UL, 0x37e0fdedUL, 0xa0248cc6UL, 0x64271b25UL, 0xb252d383UL,
+ 0xd1203060UL, 0xc10c4904UL, 0x7757ceddUL, 0x92821c5cUL, 0xe4eeb960UL, 0x3d845cb7UL, 0xcdea86eaUL, 0xab077d1dUL,
+ 0x8470dcbfUL, 0xd1f84f85UL, 0x6e3eaa4fUL, 0xe5659666UL, 0x221e272fUL, 0xf14f2236UL, 0x1d9b89caUL, 0xc979e5aaUL,
+ 0x78c99fd8UL, 0x3439e0e1UL, 0x54f937a2UL, 0xf3488cf1UL, 0xbaa8ce03UL, 0xda0f88efUL, 0xe65c05beUL, 0xd5ea7724UL,
+ 0xa353e694UL, 0xd1febafUL, 0xaf329ab3UL, 0xb0d5f831UL, 0x16a181d0UL, 0x4facbd37UL, 0xa5ab257eUL, 0x94790f90UL,
+ 0x2e407563UL, 0xc505b5UL, 0x146c6445UL, 0xf3ac918aUL, 0xe11f20a7UL, 0xc69db98aUL, 0x8e4408f5UL, 0xa9dc97fdUL,
+ 0xe896803dUL, 0x692a0f35UL, 0xf9e11348UL, 0x714e2e4cUL, 0xa8fa6833UL, 0x7919966cUL, 0x30adafa0UL, 0x1e54b91UL,
+ 0x4f34b472UL, 0xd2133609UL, 0x5c0b1012UL, 0x311d0c36UL, 0xd8be1646UL, 0xbc9b10ebUL, 0x82858aaeUL, 0xf75db61bUL,
+ 0x19022ec5UL, 0xf76bbe8fUL, 0x4997df62UL, 0xfedd18e1UL, 0x457ec0fcUL, 0xf23b559aUL, 0xccf1a1daUL, 0x87726c39UL,
+ 0x41e49050UL, 0x5e8a9e37UL, 0x47c6f55UL, 0x6173d6baUL, 0x9fa0bb40UL, 0x3454b587UL, 0x4efedaf7UL, 0xe4daa7b8UL,
+ 0x6057fbd5UL, 0xbdd7b578UL, 0x12083b07UL, 0xb2ff1d9aUL, 0x35c128c2UL, 0x8dd0891cUL, 0x6e72d2caUL, 0x4009e579UL,
+ 0x2b73a93bUL, 0xedfdf7e3UL, 0xf4ef9ea6UL, 0x2b0bc22dUL, 0x82f4fbb6UL, 0x3f0920efUL, 0x44d13e68UL, 0x4f911203UL,
+ 0x88e4154bUL, 0xa5ee3218UL, 0x3794ba6aUL, 0xe4fb9104UL, 0x25634020UL, 0x4c5dd86aUL, 0x6fb66164UL, 0xae471482UL,
+ 0x1f4119ffUL, 0x2be11684UL, 0xc259bb9fUL, 0xf55900bbUL, 0x2cd0d2acUL, 0x81a1fdfdUL, 0x4e5e2e32UL, 0x16982d5bUL,
+ 0xd22def68UL, 0xbe4172aeUL, 0xd9bc3f19UL, 0x11e09527UL, 0x1c7bce90UL, 0x90e2908cUL, 0x90953fcbUL, 0x5dedce4aUL,
+ 0xc7b3c31dUL, 0xa9c97fe7UL, 0xac544be9UL, 0x529cfdb1UL, 0x96210534UL, 0x8d03a3b1UL, 0x9ebb980bUL, 0xfe27b8dUL,
+ 0x8edff339UL, 0x88fbf55bUL, 0x6e7deb44UL, 0x68f90909UL, 0x2c908de4UL, 0x3e8550e0UL, 0xdc0cadeeUL, 0xb3ec2efbUL,
+ 0x6c2ce62fUL, 0x8063bf1aUL, 0xcfb8b74UL, 0xd8c95a1UL, 0x92f490fcUL, 0x7566c0c4UL, 0x1c42fac5UL, 0x604be384UL,
+ 0x45ecb9dfUL, 0xa69f4c24UL, 0x8594b1d1UL, 0x8cc76b11UL, 0x90ca8670UL, 0x22c31b72UL, 0x83b5f1aeUL, 0xf5621809UL,
+ 0x76d207baUL, 0x6fd053fdUL, 0x39a3cc66UL, 0x4b654c6dUL, 0x7f475f6cUL, 0x548280b1UL, 0x174e005fUL, 0xdce61263UL,
+ 0xfa06658bUL, 0x3a7ae586UL, 0x4a9aa7ceUL, 0x11b074beUL, 0x3fc7e673UL, 0x413148dUL, 0xd2a819a4UL, 0x128fffbaUL,
+ 0x7b63bc80UL, 0x4f73ededUL, 0x92c844aeUL, 0xf24cea38UL, 0x265b55b0UL, 0x6854d801UL, 0x83b07168UL, 0x10fe4c6cUL,
+ 0x6db44b3fUL, 0xe3ff450eUL, 0xcbda76c4UL, 0x36a5416cUL, 0xa4e36f66UL, 0x92fd1cc5UL, 0x47519fe5UL, 0x52c3b94cUL,
+ 0xbda5da29UL, 0xe0031f29UL, 0xb7387eaeUL, 0xc1fc942UL, 0x1c0f194fUL, 0xa52261cbUL, 0xc1d27831UL, 0x6a29f7e5UL,
+ 0x7a8f0ff6UL, 0xae0b77b5UL, 0xe71b9e72UL, 0x2858b483UL, 0xf620fe52UL, 0xa273c575UL, 0xa901db9cUL, 0x12ccd14dUL,
+ 0xf467ae28UL, 0x618a15b5UL, 0xe6ebde09UL, 0x2c130aaaUL, 0x574d5bfeUL, 0x58550387UL, 0xf4433ac9UL, 0x81563078UL,
+ 0xa04fd6cfUL, 0xc69cec6aUL, 0xa8e8b01cUL, 0x766a3db0UL, 0x8c267169UL, 0x9c5bbbaeUL, 0xef7e0baeUL, 0x50e4ca18UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0xeca9fd45UL, 0xfa05ee57UL, 0x33dc9249UL, 0xbc13597eUL, 0xa2ad4a39UL, 0xce729e7aUL, 0xd94e59c1UL, 0xcd862f8bUL,
+ 0xbdf628ebUL, 0x8bca14acUL, 0xf592ebb7UL, 0x8551660bUL, 0xcd24b88cUL, 0x7e1a4872UL, 0x15a4df42UL, 0x8990cfc9UL,
+ 0x73dbd253UL, 0x73d684ebUL, 0xef16f1afUL, 0x7bf8da2dUL, 0xb0432e92UL, 0xca6d9191UL, 0x78708e3eUL, 0x7149bdddUL,
+ 0xe8e3f01bUL, 0x35fd6ef5UL, 0xe2cd4a38UL, 0xc93852cbUL, 0xe4f1ceddUL, 0x424a9908UL, 0x6a4c24b0UL, 0x3e706f35UL,
+ 0x9c56dc86UL, 0x8a54055dUL, 0x21b6ee4bUL, 0xd377e309UL, 0xb2d80a2dUL, 0x85d7ed18UL, 0x31b01f3UL, 0xd1df7afUL,
+ 0xab647a26UL, 0xcd78e094UL, 0xe4001079UL, 0xba566a84UL, 0xb5aa344cUL, 0xe3a8a875UL, 0xcfd6ed9eUL, 0xa716eef9UL,
+ 0xa2c19a8eUL, 0xe43157eeUL, 0xc4df6aaeUL, 0xe4704806UL, 0xb5bc8254UL, 0x603bf6c2UL, 0xe06b73d2UL, 0x871771b3UL,
+ 0x8eab200bUL, 0x117143beUL, 0xf43b9984UL, 0xb4f1dfedUL, 0x9f58e7bcUL, 0x15d3f344UL, 0xf5396ae4UL, 0xeefcca4dUL,
+ 0xf9026f04UL, 0xf3b2f60cUL, 0xa79b8a80UL, 0xe5f9f4f0UL, 0xf30318ceUL, 0x2c7aa915UL, 0x8e87f382UL, 0xd9c82f92UL,
+ 0x4f1677eaUL, 0xd323e577UL, 0x965c4dbcUL, 0xdb5845d8UL, 0x6d43dac0UL, 0xed44c0e3UL, 0x8385cfceUL, 0xc7a81effUL,
+ 0x1a0e6919UL, 0xf2030b94UL, 0x85910178UL, 0xe2a644dbUL, 0xd284cdbUL, 0x7e83f929UL, 0x71b8b5a1UL, 0xb6654a12UL,
+ 0xb338107fUL, 0xc593eff9UL, 0x4b063ffdUL, 0x3cf126c3UL, 0xa2c68c2aUL, 0x4d7665fdUL, 0x7fc6582bUL, 0x5e247fd9UL,
+ 0x89d65f4UL, 0xa60f6abcUL, 0xe25388aeUL, 0x77ebdee0UL, 0x55d0aa17UL, 0xf62a19e5UL, 0xccb0aa35UL, 0x746a8fc4UL,
+ 0x6e11d5f5UL, 0x420bdfa0UL, 0x4d2d1d28UL, 0xe4cafedbUL, 0x4dee025bUL, 0xe4f7b992UL, 0xfdd92e50UL, 0x4ce1afdbUL,
+ 0x14e07cfeUL, 0x31e7d544UL, 0x779ad221UL, 0xda896b6aUL, 0x97408a4cUL, 0xd0c9af77UL, 0xf7fce206UL, 0xe1687978UL,
+ 0xf1af973cUL, 0x12bc782dUL, 0xbfea93fUL, 0x7dd66c9eUL, 0x3b55bb30UL, 0x3693eaa4UL, 0xbecea4e9UL, 0x89db2399UL,
+ 0xe63ac60fUL, 0x2aff7a48UL, 0xdefe4c24UL, 0x62f17ce5UL, 0xa1effd9aUL, 0x1863705cUL, 0x1b395ad4UL, 0x15576db2UL,
+ 0x409914eeUL, 0x5f305d90UL, 0xe02ada0fUL, 0x1db73f60UL, 0xd47d2a0bUL, 0xcc64f3efUL, 0xb1c58433UL, 0x70f50fc3UL,
+ 0xaa2d64a1UL, 0xf642f70bUL, 0x2c07f72eUL, 0x7489a46eUL, 0xa4050beeUL, 0x761038e1UL, 0xf50db12fUL, 0x9652702dUL,
+ 0x6c622b6bUL, 0xcdbe3f7cUL, 0x500ee81aUL, 0xb900efa0UL, 0x19dd119eUL, 0x1c69ac35UL, 0x4b7aa505UL, 0x8ebb18e2UL,
+ 0xda47b623UL, 0x5e90d5e7UL, 0xfc6142b6UL, 0x33ce90deUL, 0x22f4d4d1UL, 0x91135fbcUL, 0xcc804b81UL, 0x6ebd4e9aUL,
+ 0x85d1cdf0UL, 0xd742ac52UL, 0xdc5add69UL, 0xe455771fUL, 0x802cf323UL, 0xe4e531faUL, 0xce822bdcUL, 0x5802e811UL,
+ 0xf7052323UL, 0x44393dc5UL, 0x41fb5852UL, 0x117987dbUL, 0xe99c916bUL, 0xb51dddaUL, 0x8375542dUL, 0x37c213a8UL,
+ 0x3058ecd8UL, 0x99693984UL, 0xb0bcf2d3UL, 0x459a74a2UL, 0x20058157UL, 0xf0a06e1bUL, 0x901c3fb3UL, 0xce4c9f17UL,
+ 0x82bd6510UL, 0x1a49f057UL, 0x60a92c9bUL, 0x526cf2dbUL, 0xdc12ff8eUL, 0x25da9668UL, 0x9a8fd817UL, 0xf0d66e05UL,
+ 0x850ed00UL, 0x5fce8afbUL, 0xd309252bUL, 0x78ee95caUL, 0x130413b7UL, 0xded78b3bUL, 0x298fcefaUL, 0x5ac731d8UL,
+ 0x34ae724UL, 0x5338f243UL, 0x998fadb4UL, 0x97858a25UL, 0xdbce408fUL, 0x7690c51eUL, 0x4c8dd115UL, 0x3216af8cUL,
+ 0xe5b22655UL, 0xbc6d089fUL, 0xb441c880UL, 0xcca6efe5UL, 0xe87a6165UL, 0x62e424e3UL, 0x8c753d6bUL, 0x86de40b8UL,
+ 0x8bf0c8b5UL, 0x7d07b197UL, 0xeb1ba739UL, 0xf4e1a98fUL, 0x3e8937bUL, 0xd95de43aUL, 0xd56761b6UL, 0x90c11e8cUL,
+ 0x6952f9b6UL, 0x8925919dUL, 0x89e59b82UL, 0x142004cbUL, 0xcc6c2380UL, 0x2e75d65UL, 0x8ab424cdUL, 0x5fda8529UL,
+ 0x48218760UL, 0x5af6a751UL, 0x4a9100f4UL, 0x245e5f01UL, 0x6f7c1f01UL, 0xabf3c3a9UL, 0x42942affUL, 0x81d0a480UL,
+ 0xc35734a8UL, 0x9a28eddeUL, 0x41ce94acUL, 0xab7420afUL, 0x12d38ce7UL, 0x4ef14ad9UL, 0x814f295UL, 0xe3b34d78UL,
+ 0x1b168f0aUL, 0x7fa8928eUL, 0x81441d0eUL, 0x9ed80d92UL, 0xcb17016aUL, 0xe0a4c053UL, 0xe1eb0ab3UL, 0xb060e159UL,
+ 0x73cf5dUL, 0xd3c89938UL, 0x154018d1UL, 0xbf6f4b06UL, 0xe1d39c76UL, 0x4a58327bUL, 0xd2b65456UL, 0x818c3c2UL,
+ 0x81845112UL, 0xfd44e234UL, 0xf3e5dd85UL, 0xda75bc16UL, 0xcc1e5ee3UL, 0xbe603900UL, 0x615958fUL, 0xc700c504UL,
+ 0xe1f09839UL, 0xc87c45e6UL, 0xb0eec9c1UL, 0x3d50f0c5UL, 0x8c341f03UL, 0xf4e2956fUL, 0x6f57e105UL, 0x49ff7947UL,
+ 0xd98af87fUL, 0xaa6e777aUL, 0x9bb96572UL, 0x98356fcaUL, 0xa4aa65e6UL, 0x239c3924UL, 0x8c2b34eeUL, 0x811f2a6eUL,
+ 0xc8ee27eUL, 0x2bc98d58UL, 0x9fdb9c2bUL, 0x802cbaebUL, 0x848f623eUL, 0x36a06f59UL, 0x52490dd2UL, 0xe36b40ebUL,
+ 0x538d8907UL, 0xe4947ad9UL, 0xe62d19b4UL, 0xcd5bdc39UL, 0x8f63dce5UL, 0x75f8992bUL, 0xb213da2dUL, 0x7ac5dd52UL,
+ 0x936ef602UL, 0x3ec0216dUL, 0xd5bfea75UL, 0x639babdUL, 0xe314ee9aUL, 0xd090094bUL, 0x1c3bbb5UL, 0x7ca06ed5UL,
+ 0x7e1a6553UL, 0x12e35dafUL, 0xbcf1beddUL, 0x7622a13dUL, 0x3eeb91a0UL, 0x123460baUL, 0x6f5a54a8UL, 0xe51b0397UL,
+ 0x94217cacUL, 0x9c3a9134UL, 0xb3df239bUL, 0x19738e3eUL, 0xd05bcd8fUL, 0x64fd004bUL, 0x874846b1UL, 0x8362c7e5UL,
+ 0x25cf24e0UL, 0x61c4e991UL, 0x58147745UL, 0xc55eb42bUL, 0x18c4c55eUL, 0x43657f6UL, 0x560559faUL, 0xfa1ffe30UL,
+ 0x1b69426bUL, 0x217593ddUL, 0x686d44d6UL, 0x5ff11cd8UL, 0x3304dc7eUL, 0xc47f6b49UL, 0xd9ba75d1UL, 0xcf7be92aUL,
+ 0xc60e68a6UL, 0xa0b993a3UL, 0xda072305UL, 0x5cfad13eUL, 0x4077cff0UL, 0xe251d584UL, 0xb0c1f6cUL, 0xc4abe396UL,
+ 0x4677d26aUL, 0x7ef517b7UL, 0x1cd6b650UL, 0xdc391c24UL, 0x33fa6ccfUL, 0x15113f8cUL, 0xb008ae9UL, 0xa669baf6UL,
+ 0x855b7a00UL, 0xb4e4523fUL, 0x137602a4UL, 0x1ef94b7UL, 0xfb1bdd1cUL, 0x73c7786UL, 0x15c001bcUL, 0x1a923e73UL,
+ 0x5a8ddab0UL, 0xa8b725d6UL, 0xf8bdc9f6UL, 0x74114f3eUL, 0xf70f0899UL, 0x6bb95f50UL, 0x454c5197UL, 0xb3a6232cUL,
+ 0x6b2e45bUL, 0xc4cc67bdUL, 0x1cbf8e35UL, 0xcfa311a5UL, 0x14a59d7eUL, 0xf190316eUL, 0xdea2e7cUL, 0x7fe2d672UL,
+ 0x21e28233UL, 0x9ad852b0UL, 0x69f42e14UL, 0x8be9814cUL, 0x9e69ea80UL, 0x116f091bUL, 0xf7c06423UL, 0x58891afbUL,
+ 0xdd05ebc5UL, 0x12a263aaUL, 0x65a38e8dUL, 0xdf4129c7UL, 0x300d5504UL, 0x19099ad6UL, 0x2b927d6dUL, 0x5df2f3c0UL,
+ 0x971f9246UL, 0xf9e333e7UL, 0x53442ec9UL, 0x4ce8e0b9UL, 0x45e873f2UL, 0xb0a847ecUL, 0xb1b9ad84UL, 0x98eda4ceUL,
+ 0xd703b56UL, 0x26a2c982UL, 0x3220f382UL, 0xb7095b37UL, 0x74e631a6UL, 0x123d706UL, 0x7162a47fUL, 0x5fafd121UL,
+ 0xcc4ca4f9UL, 0xe26a24c0UL, 0x973f1173UL, 0x1fca43UL, 0x3f9fa80fUL, 0x8eac2587UL, 0xbce1937fUL, 0xe602f77fUL,
+ 0x3e8aa1caUL, 0xa800901aUL, 0xf0cbe9c3UL, 0xada4f9ddUL, 0x7295a9f3UL, 0x20a99c48UL, 0xb6365015UL, 0x4da4b8daUL,
+ 0x3a78d4e2UL, 0xd5727a86UL, 0x7f61a808UL, 0x16d78211UL, 0xef6e7bafUL, 0x354ad399UL, 0xbe902f4aUL, 0x4f964729UL,
+ 0x293b863UL, 0x9f51dce8UL, 0x366ad787UL, 0x76399dc0UL, 0x67b11ca1UL, 0x7dde92d9UL, 0x26e2237fUL, 0x4d810523UL,
+ 0xfcb15530UL, 0x3d2099cUL, 0x2b3693a4UL, 0x1ffa4a14UL, 0xb4919897UL, 0xe8ac94f6UL, 0xe6cc53beUL, 0xca5f42eUL,
+ 0x5b011084UL, 0xf8d5eaccUL, 0x67ba48fdUL, 0xd877f174UL, 0x7103ca38UL, 0x8c268773UL, 0x85422eebUL, 0xfdb7137fUL,
+ 0x5eaa901cUL, 0x1a86fae6UL, 0x73f1eeffUL, 0xec8db310UL, 0xd6fdd9ecUL, 0x6c68ddb9UL, 0xd9ab68a2UL, 0x7e08b875UL,
+ 0x8c640fc0UL, 0xf2c994d3UL, 0xfb26ab3fUL, 0x56af2c19UL, 0xc441cac9UL, 0x1ee09d81UL, 0x5fb625b0UL, 0xcdadd7ddUL,
+ 0x35be2478UL, 0xc591b1f1UL, 0x2613cdb2UL, 0x90134ee8UL, 0xa6b101efUL, 0xb51aea23UL, 0x45aebd04UL, 0x1e960a81UL,
+ 0xb1e76d89UL, 0xfa041296UL, 0x370329deUL, 0xc867f4ddUL, 0x278dcc58UL, 0x484e016dUL, 0xd4dcb8c6UL, 0xb0f2dc0bUL,
+ 0xee54a4c0UL, 0x9e0a2516UL, 0xd2dae2a9UL, 0x5ef3cdf7UL, 0x6f8a96c2UL, 0xdec80fd2UL, 0x6303430UL, 0xdcd963d1UL,
+ 0xf3278302UL, 0x35e1821dUL, 0xb3755505UL, 0xa823e4a0UL, 0xa9bc83dcUL, 0xa43c99a7UL, 0x55c7908bUL, 0x79d4d22bUL,
+ 0x2a1231eaUL, 0x4656fe8eUL, 0x890645d3UL, 0x6e802130UL, 0x9d385125UL, 0xee0dd8b8UL, 0xa9c34b85UL, 0x956aee3fUL,
+ 0x8ce98fc2UL, 0x9c01bb10UL, 0x49f4c4c5UL, 0x9fe5c60cUL, 0xc6c740a4UL, 0xe25dd6ebUL, 0xdc4d9888UL, 0xc3fc82b1UL,
+ 0x8883a8a4UL, 0x87470ec8UL, 0x948b6317UL, 0xc135bcd2UL, 0x31516863UL, 0x3cdc5dfeUL, 0x8b2aa2f2UL, 0xbdf4ee7cUL,
+ 0x80344817UL, 0xaadef06eUL, 0xead36106UL, 0x2d69c2fUL, 0xbe8cc9d9UL, 0x29b0b877UL, 0x5a8b033eUL, 0x541c3f0eUL,
+ 0xa9d91bcbUL, 0x5af509f6UL, 0xf2c9c952UL, 0xc90d4910UL, 0x3ef621daUL, 0xf693e1eUL, 0xaf6f89f5UL, 0xb9345bb2UL,
+ 0xc1b44b85UL, 0x2060ebf1UL, 0x992372cdUL, 0xbbc9eed5UL, 0xa1b03950UL, 0xd7ecd0d1UL, 0x6ecebb90UL, 0x9edea3ffUL,
+ 0xce919ae2UL, 0x6d4dc697UL, 0x45762998UL, 0x9607ef74UL, 0x5ec6120UL, 0x5c8772acUL, 0x32fb9c1UL, 0x9fb65b62UL,
+ 0x1362e055UL, 0xefd0d198UL, 0x93160d3fUL, 0x41d49ac6UL, 0xd86d0631UL, 0x27aadadUL, 0x30ecd6f1UL, 0x8d6972c8UL,
+ 0x5764f666UL, 0xc2db0930UL, 0x9aeaf129UL, 0xf755df69UL, 0x1cbbd0fdUL, 0xa12d2c7fUL, 0x56ea407cUL, 0x56e91016UL,
+ 0xb2bb9fUL, 0x7de6f8ffUL, 0xc15d2154UL, 0x727ed08aUL, 0xe2e6a2faUL, 0x8df19701UL, 0x3f2526eaUL, 0xe1640876UL,
+ 0x3cbf965UL, 0xd7841343UL, 0x9e026a02UL, 0xb1422e07UL, 0xd303c2d4UL, 0xc85a1b54UL, 0xf1ed5459UL, 0xe0a02b8fUL,
+ 0xdd3c00f9UL, 0x9e7a81c3UL, 0xb92a3c1fUL, 0x6a7f391cUL, 0x19ca163bUL, 0xd02085c1UL, 0xe74125c5UL, 0x380d4c72UL,
+ 0xacc9200eUL, 0xdae49d09UL, 0xbd4dcb3bUL, 0xab99fa12UL, 0x71989736UL, 0x842f03dfUL, 0xcd193533UL, 0xf33be83eUL,
+ 0xd1e989afUL, 0x3ad6ad4UL, 0x4f5aef09UL, 0x5310b5abUL, 0x5000bdbcUL, 0x13faaf8eUL, 0xf351fb32UL, 0xd685cad8UL,
+ 0x35f8c0ecUL, 0x7eb17183UL, 0x421a4649UL, 0x890501e9UL, 0x2b265a88UL, 0xa6f049b3UL, 0xc18dd298UL, 0xa2e5fd8fUL,
+ 0xf2c75eedUL, 0x7401af94UL, 0x8bb87aaUL, 0xcbbb6b7UL, 0x2bd6cd79UL, 0x5cb0d1b9UL, 0x2851c9d2UL, 0xf84e0f5UL,
+ 0xd993af58UL, 0xaa44be67UL, 0x80762a3cUL, 0xbb52ca95UL, 0x5e6827bUL, 0x832c1114UL, 0x18759df2UL, 0xc545bb84UL,
+ 0xb688375bUL, 0xa9f0ce51UL, 0x27769b18UL, 0x891d1ed8UL, 0x91c35b42UL, 0xc3c14bcfUL, 0x17008543UL, 0x3c6b7469UL,
+ 0xcb879681UL, 0xbc4c5abaUL, 0x2b639872UL, 0xedcb6a10UL, 0xb8e4bd91UL, 0xc69effe4UL, 0xfb43d8f5UL, 0xb707c43UL,
+ 0x673e049cUL, 0x46e00d60UL, 0x26198e8aUL, 0x85358a77UL, 0xb94e617cUL, 0x66ff6f2UL, 0x727985ebUL, 0x7e764d67UL,
+ 0xae3bf6ffUL, 0xe0582d4UL, 0x4206f3e3UL, 0xfcc2f0d8UL, 0x77f9a3fbUL, 0x8c0516c7UL, 0x9d722681UL, 0xda21783dUL,
+ 0xeb56eeaaUL, 0xbf8005efUL, 0x436209a9UL, 0xe9988bdeUL, 0x41d5a9c7UL, 0xafd6212bUL, 0x6de7caaUL, 0x190dba34UL,
+ 0x8b21caceUL, 0xaffdbec0UL, 0x36f5edcaUL, 0xbb80423fUL, 0xc1c41993UL, 0x3f47abc7UL, 0x62710674UL, 0x66ccc538UL,
+ 0x3736ff9eUL, 0x42fcb32eUL, 0x925aea65UL, 0x74d9df89UL, 0xaf77a2c4UL, 0xa76776edUL, 0x90124fccUL, 0xbe113bbcUL,
+ 0x66355239UL, 0x90911eebUL, 0x1866effbUL, 0x62683c21UL, 0x69ee510aUL, 0xc1386275UL, 0x780e6757UL, 0xde12de46UL,
+ 0x84d83722UL, 0x20409c8aUL, 0x5f226bcdUL, 0x53cdf174UL, 0x50505fc6UL, 0x74b06fbaUL, 0x3f203af4UL, 0xe11579ecUL,
+ 0xbaa5f99dUL, 0x74d01551UL, 0xee9e29b0UL, 0xa02683c6UL, 0x3dd7cda9UL, 0xbfa560c7UL, 0xf985369bUL, 0xfdc6302cUL,
+ 0x71ea3891UL, 0x620aa9b7UL, 0x8fcfca13UL, 0xaaa2b51dUL, 0xb31d7edcUL, 0xa08bed66UL, 0x4e80fc1eUL, 0xf08d26fbUL,
+ 0x6e657ff2UL, 0xbc9dbe0bUL, 0x3aec73d4UL, 0x4b82519eUL, 0x3cc29adeUL, 0x836b84edUL, 0x23868dbUL, 0x32a34b2aUL,
+ 0x72537c6cUL, 0x6945fd86UL, 0x5e33f95dUL, 0x59f45d15UL, 0x26cd2d51UL, 0xc90cc7aUL, 0x6b0bc4bbUL, 0x645debfUL,
+ 0x5f60438cUL, 0xc66f8b42UL, 0xf7c99a43UL, 0xe0362c64UL, 0xd37ee435UL, 0xf5534e73UL, 0x503449b3UL, 0x4e68f74bUL,
+ 0x14085d6cUL, 0xa5d5cc14UL, 0xf0bf1735UL, 0xb02f5d6bUL, 0x3fb15cc1UL, 0xa6990de5UL, 0xc40839dcUL, 0x34594a19UL,
+ 0x3845af87UL, 0xa2f4bd85UL, 0xb1ff1db4UL, 0xdff68d0bUL, 0x5b822c01UL, 0x1b1fa51fUL, 0x7e2ab83UL, 0xd5e051d0UL,
+ 0xbc12bfafUL, 0x6c722589UL, 0xf7975fbbUL, 0x74873932UL, 0xeb6190a2UL, 0xc2b38b5UL, 0x27651be5UL, 0x544af063UL,
+ 0x482c2c8UL, 0x117bd6b1UL, 0x49291d49UL, 0xeed43d88UL, 0x6a09a964UL, 0x46d85ea0UL, 0x21d743ffUL, 0x205af1f1UL,
+ 0xe3c8aeb2UL, 0x23b63d8UL, 0xa1acb8c3UL, 0x9d4a1c32UL, 0x1438e712UL, 0xd7707734UL, 0x875ebfdcUL, 0x727cb55dUL,
+ 0xf4e43a3aUL, 0x3b28b4a5UL, 0xbca7a2e1UL, 0xfdd793c1UL, 0xc398ff6bUL, 0xfb3a593dUL, 0x7a8d0a42UL, 0xe32e8295UL,
+ 0xda19ad94UL, 0x2e1a054dUL, 0x30fca24dUL, 0x3c3b7447UL, 0x309fb4c3UL, 0x1e1949b9UL, 0x73657777UL, 0x78545423UL,
+ 0xd2ef3735UL, 0xb1e37d19UL, 0xe8ee3342UL, 0xd20716f1UL, 0xef7e8bc3UL, 0x2e4eef9aUL, 0x3b5a573bUL, 0x149c6b76UL,
+ 0xbb515a31UL, 0xb767f9ceUL, 0x2e34e006UL, 0xb3f7777eUL, 0xdcebcbdcUL, 0x7ab1d275UL, 0x8a7c6b7bUL, 0x918b2a0UL,
+ 0x3cc25147UL, 0x2b723052UL, 0x814daf42UL, 0x9ad97adeUL, 0x1e2f64a4UL, 0xa4a221f2UL, 0xf30764bcUL, 0x950d2c9dUL,
+ 0x1dc1e8f0UL, 0x11a6e0e7UL, 0xcf72e283UL, 0x1da16abeUL, 0x222eff71UL, 0x12dd4db2UL, 0xb307f1d8UL, 0x8e004808UL,
+ 0x97931164UL, 0xe25aa7aUL, 0xdc3fd1f5UL, 0xc06266c7UL, 0xf1f66f02UL, 0x697b17b2UL, 0x599eb32UL, 0x9e797676UL,
+ 0x7dbf0315UL, 0x6badc54cUL, 0x5b2ca4eUL, 0x81baaf1aUL, 0x9cfe8900UL, 0x43cf8b15UL, 0x2ab77f2eUL, 0x16f392dUL,
+ 0xd44a1780UL, 0xd8f16810UL, 0x79bd3e71UL, 0xf058c025UL, 0x50df32d6UL, 0xf4661b49UL, 0x1a15be44UL, 0x4b1b76c8UL,
+ 0xc64e86e2UL, 0xbef157c8UL, 0x16cd18bcUL, 0xcf00577cUL, 0xa74c2771UL, 0x93cf98cfUL, 0x64eaffb2UL, 0x2136f21aUL,
+ 0x27bd9662UL, 0x7b1b7137UL, 0x1ab2cbbeUL, 0x8265f850UL, 0x5e82cadaUL, 0xe3cb025bUL, 0xc7dd3cbaUL, 0xe6116608UL,
+ 0xa2ee860cUL, 0xa2dcd867UL, 0xb1877597UL, 0x4dd0b5ceUL, 0x6b386c51UL, 0xdd6a5c34UL, 0x80e0a4c2UL, 0x2e6037bcUL,
+ 0x6693cc4cUL, 0x9113939dUL, 0xe072daadUL, 0xbd9399bcUL, 0x5fccb621UL, 0x9f694cb9UL, 0xe319369bUL, 0x425d3990UL,
+ 0xf5e7a6bdUL, 0x67a59433UL, 0x3844ee1cUL, 0xef9f3e0aUL, 0x1f2cdaafUL, 0x5182d18dUL, 0x528c5baeUL, 0x74be4e07UL,
+ 0x1a5c23ceUL, 0xcad8d6f1UL, 0xe56c2ef5UL, 0x9419c8baUL, 0x92de672bUL, 0x6349a39UL, 0x7cdc015cUL, 0xe0dbcf26UL,
+ 0xf9758e1fUL, 0xe2450c00UL, 0x7536e1aeUL, 0x573509f1UL, 0x676b67f5UL, 0x9dd391b6UL, 0x92de89acUL, 0xcc50046eUL,
+ 0xf5861321UL, 0x9f33df02UL, 0x4c0201aaUL, 0xcddefb6eUL, 0x47794e02UL, 0x4b381810UL, 0x675d7724UL, 0xa72fef18UL,
+ 0x84778143UL, 0x48f36bf3UL, 0x53320f51UL, 0xd3e40fc5UL, 0xc1b61806UL, 0x3a5ac83eUL, 0x8622703cUL, 0x6688dc6aUL,
+ 0x7565f8c1UL, 0x5e86e76aUL, 0x3a8d7cbcUL, 0x8a609539UL, 0x4e33f520UL, 0x177e6da0UL, 0x37bd2e76UL, 0xc76b916UL,
+ 0xea8b9be5UL, 0xa3bdced9UL, 0x5c64e6cbUL, 0xd54b4801UL, 0xc8ae77a0UL, 0x2c20a921UL, 0x3f576f0cUL, 0xd51b4bb0UL,
+ 0xcb15aed8UL, 0x48645268UL, 0x245f6cb7UL, 0x67e4765UL, 0xa89828b3UL, 0x3cbf7771UL, 0x1a746545UL, 0x795012edUL,
+ 0x4e072e02UL, 0x166ec732UL, 0x2bccf3b6UL, 0xd4960d4UL, 0x9b7230eUL, 0x63d52aa8UL, 0x5a139800UL, 0x13a38308UL,
+ 0x323d9b4dUL, 0x25354b9cUL, 0x25564a72UL, 0xbba131b6UL, 0xf2c83dd0UL, 0x6fec35eaUL, 0x77f9547fUL, 0xe8ebed9UL,
+ 0x8cfa0deaUL, 0x77e3cb88UL, 0x280f9f3aUL, 0xc56c499fUL, 0xf90266a1UL, 0xd7f698efUL, 0x38c573b9UL, 0xc737d9b5UL,
+ 0xcb84c1c8UL, 0x7b734b05UL, 0xe950b815UL, 0x9c1163d6UL, 0x10162e12UL, 0x397f039eUL, 0xb225a634UL, 0x1098cd83UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0xe162bd17UL, 0xf32f75c7UL, 0xb517821UL, 0xd56502e2UL, 0xf8bd2ebcUL, 0x778098a7UL, 0x1fb4e8baUL, 0xb70ce07aUL,
+ 0x9002587cUL, 0xbe695f99UL, 0xe678f51cUL, 0x889bb8e3UL, 0xb8648541UL, 0xee0100c6UL, 0x7c4a2021UL, 0x56cf6a4bUL,
+ 0x829e0e89UL, 0xe1d486bUL, 0x80f031e5UL, 0x65d8d445UL, 0xdcccc0e7UL, 0xbe2523cbUL, 0x843381ffUL, 0xcaaf4b37UL,
+ 0x2d69fec0UL, 0xf40616efUL, 0xf88452c7UL, 0x30f89eddUL, 0xd3b895cdUL, 0xce77a067UL, 0xdaf2d1fUL, 0x43ea1afaUL,
+ 0x2256e0b6UL, 0x5cce7953UL, 0x6aeefa1bUL, 0x98054077UL, 0xd453c698UL, 0x792c11efUL, 0x83483ef5UL, 0x8a97f513UL,
+ 0xf4035fd0UL, 0x643c724UL, 0xd52c492cUL, 0xd274694eUL, 0x9b8a5728UL, 0x522ecfd6UL, 0xc432d14fUL, 0x861b425eUL,
+ 0x116588fbUL, 0x57c3dc8cUL, 0xbc5cf0c1UL, 0xc3d51148UL, 0x777bc09bUL, 0x433b76afUL, 0x9d01f220UL, 0x1230810aUL,
+ 0xa7b63bc9UL, 0x2340865aUL, 0xbbfb3906UL, 0xf1a18044UL, 0xd1c8179fUL, 0xa9f8920UL, 0x5c870d40UL, 0x642f6527UL,
+ 0x4d02af4UL, 0xf3073a0aUL, 0x611f5010UL, 0x9dc6befUL, 0x2b71f696UL, 0x6a671ba0UL, 0xe71dd26cUL, 0x40508621UL,
+ 0xe31d0d58UL, 0x50405743UL, 0x8b8a46e8UL, 0x15971e6eUL, 0x7afc10ebUL, 0x45161197UL, 0xba44cdf8UL, 0x814f3af4UL,
+ 0xaf1dde65UL, 0x177d66ccUL, 0x44dd8038UL, 0xd6dbbe7cUL, 0x26764a5cUL, 0xeefac7b6UL, 0x4c695809UL, 0xca185df6UL,
+ 0xe9270ccfUL, 0xb59c2a9cUL, 0x9c07f378UL, 0x79d4fbb8UL, 0xe54c402fUL, 0x24302f81UL, 0x8701c246UL, 0xb6430716UL,
+ 0xc32946d8UL, 0x599980e9UL, 0x8d5f1cbUL, 0x8121ac9UL, 0x946884f3UL, 0x18256d95UL, 0x30ec1ca4UL, 0xdc5c79feUL,
+ 0xd06beae3UL, 0xa7089ecfUL, 0x5adf88f2UL, 0xb7769bd3UL, 0x7a2f2dc4UL, 0x60ce2b07UL, 0x6d6b02c1UL, 0x79367a20UL,
+ 0xa11aee99UL, 0x6bfa20a5UL, 0x8f7c4c59UL, 0x87078665UL, 0x718acb6eUL, 0xd72eb785UL, 0xfb733ff1UL, 0x4976d30eUL,
+ 0x95a31e2eUL, 0x26ff47eeUL, 0x90bcad23UL, 0x5647f360UL, 0xbdfc25adUL, 0x8c2233a4UL, 0xae19ea20UL, 0x4a657f0cUL,
+ 0x9950f0c4UL, 0x1ede6378UL, 0x30b2ed8fUL, 0xacc9f8e0UL, 0xd50529b5UL, 0xd044a50UL, 0x7b56999cUL, 0x158e39d8UL,
+ 0xb48ec67aUL, 0x914aaa95UL, 0x14f418b4UL, 0x2158a709UL, 0xb30b1c0aUL, 0x9f04f177UL, 0x6a5ca00aUL, 0x64295e2dUL,
+ 0x4713bcd5UL, 0xcad956bbUL, 0xa9dc5298UL, 0x7db646c9UL, 0x406ab159UL, 0xeaedf191UL, 0xc3d93f5aUL, 0xc883d8adUL,
+ 0x60f0a214UL, 0xb98c4346UL, 0x9e513024UL, 0xc8f0fa89UL, 0x4fb7087cUL, 0x43f8ae94UL, 0xdca341aUL, 0xb701e28eUL,
+ 0x9844e267UL, 0x5a48206eUL, 0x6c385faeUL, 0x2b2abb4aUL, 0xbf2c8522UL, 0xbd2681c4UL, 0xd617ff69UL, 0x929f2d48UL,
+ 0x886356f2UL, 0xfd75187aUL, 0xb3f1a36bUL, 0x8f8059f5UL, 0xf97f9b88UL, 0xe77ce033UL, 0x36aece59UL, 0x173c385fUL,
+ 0x8182c3f3UL, 0x7c67140fUL, 0x3aca58e3UL, 0x7e06574dUL, 0x80fc4dbUL, 0xfb34ec44UL, 0x485cd3c9UL, 0x22f30726UL,
+ 0x1c0828e4UL, 0x72053211UL, 0x402f599eUL, 0x80a94bb1UL, 0xa1eff441UL, 0x3ecd0f16UL, 0x6d89218UL, 0x31da1266UL,
+ 0x4a192e08UL, 0x38450ec9UL, 0xc1c6f751UL, 0xe145450aUL, 0xd3ae3e5dUL, 0xbc3a7f2bUL, 0xd4d1e289UL, 0x93e4d514UL,
+ 0x9b5b21d5UL, 0x897eaa21UL, 0xfc821e73UL, 0xfa9c65cUL, 0x69520d69UL, 0x35ef1335UL, 0x1997908dUL, 0xfa072454UL,
+ 0x2b8583ebUL, 0xc7633da0UL, 0x90459fc8UL, 0xc6c6a875UL, 0xf0181e94UL, 0xc9d31bc7UL, 0xa8b480b4UL, 0x5c0cd701UL,
+ 0x74fdc5e9UL, 0x714e33bUL, 0x9e104bb4UL, 0x8692bd19UL, 0x67c7f8d6UL, 0x2f7a7327UL, 0xdff2b229UL, 0x417b7c41UL,
+ 0x56c6e3a6UL, 0x5b191bcaUL, 0x248240f1UL, 0x42a15a29UL, 0x95ddbafUL, 0x4f076058UL, 0x21f3c711UL, 0x10059ed9UL,
+ 0x9d2421ffUL, 0x7e2629b4UL, 0x7880d1c3UL, 0xf1703c16UL, 0x23af57e5UL, 0xa6a12463UL, 0xdadbd763UL, 0xc656c351UL,
+ 0x18d574e1UL, 0x39e4d8aeUL, 0x6847f0ffUL, 0x95d901a6UL, 0x72a3408eUL, 0xfddb879cUL, 0xe9f47a2eUL, 0x71847016UL,
+ 0x2e6b3496UL, 0x8604baf3UL, 0x92d2d665UL, 0x858336b3UL, 0x808e08e0UL, 0x18fd011aUL, 0xea232e8UL, 0xc52916a5UL,
+ 0x453f286aUL, 0xca85d855UL, 0x2917375UL, 0x1394f412UL, 0x22febaccUL, 0xf10af5d3UL, 0x9ed142ecUL, 0x51a61b61UL,
+ 0x7c1f3ddcUL, 0x4d1bff19UL, 0xa34631fbUL, 0xd2bd2941UL, 0x6fc624afUL, 0x9336ac3aUL, 0x93b16b16UL, 0x5d5c8e74UL,
+ 0x97719921UL, 0x5e27e6e6UL, 0xa5e4975aUL, 0x33c5524cUL, 0x1aa3e221UL, 0xa3cbdfb0UL, 0x49d1ae9dUL, 0xa0ebc224UL,
+ 0xceadb418UL, 0xa372bc6dUL, 0xbae420e4UL, 0x8eb90493UL, 0x33e78933UL, 0xa73d9a4aUL, 0xb2655c07UL, 0xb3543547UL,
+ 0x6ede0c32UL, 0x4583d64bUL, 0xfa60eb8UL, 0x402ec0d6UL, 0xd60f3781UL, 0xa290e440UL, 0xe6b6ba85UL, 0x951b0a5eUL,
+ 0x3dc47bdcUL, 0x70357a8aUL, 0xf8829f54UL, 0xb87d3786UL, 0x3318164eUL, 0x9977f1abUL, 0x3fdd51a7UL, 0x1fc1b51aUL,
+ 0x3ad7fd04UL, 0xb62c51a5UL, 0xe0fa42bbUL, 0x87d9f89aUL, 0x7518d7e2UL, 0x210895f5UL, 0xd8826191UL, 0xc31590beUL,
+ 0xc9802beUL, 0xc432b610UL, 0xfb904363UL, 0x6269c388UL, 0x695a664fUL, 0x12088d69UL, 0x3ce4d74eUL, 0x6d985962UL,
+ 0x6035085cUL, 0xf9d6789bUL, 0xff086dcUL, 0x85dd7254UL, 0x77567a06UL, 0x37461219UL, 0x14654dedUL, 0x10ce16d8UL,
+ 0xd3d404b1UL, 0x77798e53UL, 0xf7aee60dUL, 0xb3bd8f77UL, 0x7c1a3827UL, 0xb7519249UL, 0x9f62cfe1UL, 0x7baf6aaeUL,
+ 0x6bdb482eUL, 0xb56cdeefUL, 0x10a12e46UL, 0xd2c17381UL, 0x380729bdUL, 0x1a263bd4UL, 0x2ca51a07UL, 0xed887173UL,
+ 0x5a34c8faUL, 0xd55b5531UL, 0x92dfd5b3UL, 0xf1e8b77UL, 0x6117ca06UL, 0x1c98e9e0UL, 0x3212e8c3UL, 0x16114f9cUL,
+ 0x5a7960e6UL, 0xee7a8883UL, 0x694df672UL, 0x2baea6ffUL, 0xe034a91UL, 0x3be23d56UL, 0xc2bd68a9UL, 0x819e458UL,
+ 0x142da52cUL, 0x38f5aa05UL, 0x3a1cbae9UL, 0x414422b2UL, 0x408134faUL, 0x48c14d1bUL, 0xb1d9bb05UL, 0x85a7c7cUL,
+ 0xdb30d83fUL, 0xf59dc046UL, 0x5e8cd03dUL, 0x4a18ea0eUL, 0x9b72b01dUL, 0xa422129cUL, 0x80adc400UL, 0xa6dc667cUL,
+ 0xe7f18682UL, 0x7e26457bUL, 0xeb730bf8UL, 0x9774b564UL, 0xcb6a0dc6UL, 0xc8dfe710UL, 0x80ecc335UL, 0xa10bafb1UL,
+ 0x53a17ce5UL, 0x20f3cc35UL, 0xcfeaaddeUL, 0x5b6c778fUL, 0x8dd055f2UL, 0x79f29dd5UL, 0xa0c645acUL, 0x2ada0d63UL,
+ 0x65cabb69UL, 0x16c37669UL, 0x5157554aUL, 0x4f19cd70UL, 0x872a80e8UL, 0x77e414e1UL, 0x121d3dfdUL, 0xf9452bfaUL,
+ 0x714cdea3UL, 0x623cc678UL, 0x9ae2f108UL, 0xe6d76871UL, 0x7a0b6747UL, 0xd6bfb9ecUL, 0xde5450c0UL, 0xe5e56841UL,
+ 0x8abdb0e5UL, 0x24cd0b9bUL, 0xb318ea10UL, 0x33a89563UL, 0x5e040f92UL, 0xdea10e77UL, 0xdb83c07eUL, 0xf269220cUL,
+ 0xec954eedUL, 0x3db279c1UL, 0xa7638e47UL, 0x9229374fUL, 0xacdc89beUL, 0xe44b78deUL, 0xe0d8250eUL, 0xb1fba819UL,
+ 0xa9a2e18bUL, 0x32c55f7dUL, 0x68931f36UL, 0x3e6b7f4eUL, 0x27c27001UL, 0x929f7c8cUL, 0xb4ea4ddaUL, 0x2e8f45aeUL,
+ 0x8cbae163UL, 0x684ad8eeUL, 0x6766b42eUL, 0x4f23cc7dUL, 0xb075a4acUL, 0xd46d1b25UL, 0x72d68785UL, 0x8b329322UL,
+ 0x1102df25UL, 0xf9291a11UL, 0xce09b9b1UL, 0x8cc2e8f1UL, 0xfbf36911UL, 0xee77334cUL, 0xdb73c025UL, 0xa12a0106UL,
+ 0xdde97cb5UL, 0x5c25a2fbUL, 0x265df0a2UL, 0x35db98d4UL, 0x98770f18UL, 0x11b37485UL, 0xccde47bUL, 0xff95de83UL,
+ 0xe4ed124UL, 0x15040d4bUL, 0xfb47fff8UL, 0x31706c58UL, 0x2042ec06UL, 0x1bf581bcUL, 0x5b7ffb72UL, 0x2b651471UL,
+ 0x5b91f116UL, 0x11928e28UL, 0xa25f0872UL, 0x50051b19UL, 0xc7f4cd43UL, 0xe6c1513bUL, 0xa050091aUL, 0xd749f8ceUL,
+ 0xd84065bfUL, 0xc2fb8211UL, 0x67ecfee2UL, 0x1a51b733UL, 0xb700f17cUL, 0x3a38672fUL, 0x3c5385cbUL, 0x6962eb83UL,
+ 0xcdf8d1c2UL, 0xbde1a94fUL, 0x96b203c6UL, 0x7680c89aUL, 0x6adb90c4UL, 0x9b6eea30UL, 0xb50ce8a1UL, 0xe3f09d85UL,
+ 0x38aedf77UL, 0x84a6ee3dUL, 0xb71e47a7UL, 0x8328a936UL, 0x2be46c4bUL, 0xdd805975UL, 0xc43827e3UL, 0x2535cb4fUL,
+ 0x43c9af75UL, 0xdcfe2384UL, 0x1e7c780UL, 0x18f9b97eUL, 0x9fb0fedfUL, 0xf4eb56ceUL, 0x261c43b0UL, 0xe77de0ceUL,
+ 0x26a46566UL, 0x94ff9d0UL, 0x9d5e83e0UL, 0x87ab693bUL, 0x624bba70UL, 0x114cb018UL, 0xda1aefdbUL, 0xedd055ceUL,
+ 0x917210b0UL, 0x4e1c1bb4UL, 0xa819c7cbUL, 0xce637d25UL, 0xc57d9446UL, 0x9ffb194dUL, 0x70a15502UL, 0xbdea66dbUL,
+ 0x64090148UL, 0x8a5f0a22UL, 0xe3af318dUL, 0x6f3167caUL, 0x7cde608cUL, 0xa975a126UL, 0xfd7c988fUL, 0x9529d910UL,
+ 0x78d465aaUL, 0x82db75a7UL, 0x9ee32b66UL, 0x74af85c1UL, 0xc86478f6UL, 0x9c2678d9UL, 0xdb04b0deUL, 0xeb611185UL,
+ 0x2240aa60UL, 0xee786fd9UL, 0xb3331c98UL, 0x88d018a2UL, 0xf27f67bcUL, 0x729deedbUL, 0xd8285584UL, 0x9406d9a1UL,
+ 0xd1f13f0UL, 0x6cf30378UL, 0x355139cbUL, 0x465ec41fUL, 0x6da797cdUL, 0xdc804227UL, 0x626d1e0dUL, 0xeaa363fcUL,
+ 0x9fec93c3UL, 0xcb872588UL, 0x9d8471eaUL, 0xd3139e35UL, 0x5cefb304UL, 0xc6b3f34bUL, 0x977fa18fUL, 0x37566f98UL,
+ 0x4681d374UL, 0x4534002bUL, 0xdffcc399UL, 0xbac7e33eUL, 0x67f83f73UL, 0x8fc28c81UL, 0x7f329083UL, 0x64c97620UL,
+ 0x39d1ca0cUL, 0x7befeb43UL, 0x5bffe2edUL, 0x741668ffUL, 0xad64e2c4UL, 0x6be7ac88UL, 0x1879b398UL, 0x519b7697UL,
+ 0x5b78d04aUL, 0xe88b6761UL, 0x37702f14UL, 0x8cd85f8fUL, 0xc6cc8728UL, 0x85c7d50dUL, 0x8bcba949UL, 0x921e2472UL,
+ 0x8ee5a4aeUL, 0xb9afb3ddUL, 0x2d14fb19UL, 0x2c7c2b36UL, 0x849be4aeUL, 0x99fa0775UL, 0x5b89af4UL, 0xd59a5417UL,
+ 0x2096b8c7UL, 0x57306568UL, 0xf51cdb99UL, 0xf737538aUL, 0x98d14a3bUL, 0xfc6fb44dUL, 0xe0da39e5UL, 0x21fe77b0UL,
+ 0x5defc1a5UL, 0xda30b0caUL, 0xfda2cbeUL, 0x9d5b11e1UL, 0x2af9785dUL, 0xd3ff9c40UL, 0x800f0b48UL, 0x80745777UL,
+ 0xa57f12abUL, 0x44a23e74UL, 0xa904adceUL, 0xee74c403UL, 0x3170e90bUL, 0x698352eaUL, 0x2878d734UL, 0x5b8d1512UL,
+ 0xf18d5d8aUL, 0xff38be84UL, 0xb225def6UL, 0x254afeccUL, 0x71e5f742UL, 0x43f00871UL, 0xd729efb6UL, 0xed311d9eUL,
+ 0x1f27ccd7UL, 0xe7688425UL, 0x3cf8dd8eUL, 0x292d87d4UL, 0xa514ac31UL, 0x63c146f2UL, 0xd52a361aUL, 0xbd554524UL,
+ 0x69ff6027UL, 0xc3f2dd6fUL, 0xfd012ea7UL, 0xf78809abUL, 0xe2d02612UL, 0xdef82fc5UL, 0x46069b02UL, 0x36c6726bUL,
+ 0x83eb5a2fUL, 0xbabce5d1UL, 0x806292b1UL, 0x1d41a9eaUL, 0x5d6b5118UL, 0x11d80dedUL, 0x26636991UL, 0x1b111437UL,
+ 0x6f819729UL, 0xa6596bf1UL, 0xd5d6f2cbUL, 0x73676989UL, 0x1d46869fUL, 0x918110cfUL, 0x57b25597UL, 0xd94b9fbeUL,
+ 0x3e60f520UL, 0x30905faaUL, 0x772e730bUL, 0xfb302cadUL, 0x72af4361UL, 0xeb5a83f0UL, 0x8de07777UL, 0x6639795UL,
+ 0xf5651985UL, 0x7c076900UL, 0xf739a126UL, 0xcb60a49cUL, 0xc64148c2UL, 0xf9a5145cUL, 0x4c5c5570UL, 0xf54c2807UL,
+ 0xca650f32UL, 0x9abd3f99UL, 0x4c9490ccUL, 0x6a88a7fcUL, 0xa2743fc7UL, 0x7086deedUL, 0xb70402f3UL, 0x59ac835aUL,
+ 0xd9a93238UL, 0xf49cf320UL, 0x2e0a229dUL, 0x686635c4UL, 0xcf6a3ff3UL, 0x54d3bd65UL, 0x93c730c3UL, 0xae0977f4UL,
+ 0x1731616UL, 0x12e073a4UL, 0xdd532797UL, 0x1da73ca5UL, 0xa45ed788UL, 0x5834ae02UL, 0xf19ac834UL, 0xaad5423dUL,
+ 0x424f99baUL, 0x4ebdabffUL, 0x82d91b1dUL, 0x4245e619UL, 0xf872a40dUL, 0xe705c10UL, 0xef43df9UL, 0x866f6622UL,
+ 0x19de4a0UL, 0x993c85aeUL, 0x13ea22d0UL, 0x703918cUL, 0xb9ffad78UL, 0xd4151c3UL, 0x633d954fUL, 0x8b580766UL,
+ 0x2af93c3eUL, 0x23756e59UL, 0xd4b9b12fUL, 0xf9318f0cUL, 0x6a8e5e1bUL, 0x4ec524c4UL, 0x58f46edbUL, 0x8b126dafUL,
+ 0x1cd63c0UL, 0xf4764a07UL, 0xc4fa6039UL, 0xb94d976dUL, 0xbbd5f09dUL, 0x1837257eUL, 0xf128c7eUL, 0x167149a4UL,
+ 0xa6c617ffUL, 0x9a852863UL, 0x6f263f86UL, 0x22f444c2UL, 0xc14f0441UL, 0x98fdcc2aUL, 0xab09c8fcUL, 0x8d850b3dUL,
+ 0x1395346dUL, 0xb13c0ec4UL, 0xf33a1ac9UL, 0xc93cfe1UL, 0xfd433856UL, 0x8919a996UL, 0x65c19d17UL, 0x36b2119cUL,
+ 0x2be57495UL, 0x80ec6336UL, 0xaefae7cbUL, 0x8944928aUL, 0xa3a0d71fUL, 0x55af5edUL, 0x445cf0e2UL, 0xe6332203UL,
+ 0x894a78c5UL, 0x800305f6UL, 0xb2cdfe5cUL, 0xa35f0873UL, 0xf8727411UL, 0xe93475a5UL, 0xfcb921b2UL, 0xa9549993UL,
+ 0xe968f1f4UL, 0x1479b8d1UL, 0x4a70eb56UL, 0xea2202e4UL, 0xc90479bcUL, 0xb955f098UL, 0x41914d19UL, 0x885e89c0UL,
+ 0xd261566cUL, 0xa7099d72UL, 0xf2489c93UL, 0x6bb9f826UL, 0xef56f2e6UL, 0x5e2ecf04UL, 0xebda4a0aUL, 0x4c2ee6edUL,
+ 0xa0d5b14UL, 0x520204beUL, 0x78314e8eUL, 0xd2fb886fUL, 0x7e0aef6UL, 0x44190b3fUL, 0x13cd0b2UL, 0x6186843cUL,
+ 0x62c313e4UL, 0x80a63510UL, 0x27497aecUL, 0x69d01f7aUL, 0xfa670812UL, 0x84b80656UL, 0x3a98c291UL, 0xf090fd36UL,
+ 0x36a74d5dUL, 0x7322c269UL, 0x4b23d944UL, 0xec08c52cUL, 0xc6194f8UL, 0xd0aae7f9UL, 0x6bcc81f7UL, 0x7c309fa2UL,
+ 0xeb7b4747UL, 0xcb28d0abUL, 0xccc035b6UL, 0xa7e838aeUL, 0xc8765354UL, 0x55b01c09UL, 0xef4f7f47UL, 0xea123c52UL,
+ 0x5b0c12c3UL, 0x64897f4aUL, 0xe8564131UL, 0xb4e88fbcUL, 0xe67d941aUL, 0x59c315b1UL, 0xe4f61e9fUL, 0xdfbca66bUL,
+ 0xb50c26aeUL, 0x47258382UL, 0xba51ab36UL, 0xec1f314aUL, 0xacdd0540UL, 0x706ae95UL, 0x7abf586cUL, 0xc3c2a86dUL,
+ 0xb4c51ce7UL, 0x816bb5ecUL, 0xce7bb516UL, 0x4d9f8c86UL, 0xd91f45c0UL, 0x67a65f67UL, 0x6ddff131UL, 0xb6e8b50aUL,
+ 0x55e061a9UL, 0x57590431UL, 0xac666d83UL, 0xab063392UL, 0xaf22d5a7UL, 0xd4e0f469UL, 0x82f84c91UL, 0xb82d2c63UL,
+ 0x3d515583UL, 0xa3439237UL, 0x4f7a27f6UL, 0x7335ea60UL, 0x9322ead7UL, 0xc8b81ea2UL, 0x741797fUL, 0x8f791b9cUL,
+ 0xefaf64f2UL, 0x3dc0140bUL, 0x6b084f13UL, 0x28e7dff7UL, 0xe0140354UL, 0xf5555d5aUL, 0x64c3a48bUL, 0xb8899c0cUL,
+ 0x17da392dUL, 0xfdde3d54UL, 0x369bf191UL, 0x2f0c1660UL, 0xcccfc40aUL, 0x85f0296fUL, 0x66c95f49UL, 0xe5162c39UL,
+ 0x16ed46ebUL, 0xf26947bUL, 0xe803d575UL, 0x769f2f4cUL, 0x11434ab3UL, 0xbca85692UL, 0xe3a8ab9UL, 0x92f4f5e0UL,
+ 0xab6b0f95UL, 0x5c7c776eUL, 0xa87bf80eUL, 0x520d21b4UL, 0xc4be1d5fUL, 0xce476babUL, 0xbbc30c8bUL, 0x5e2237f4UL,
+ 0xcd295a16UL, 0x6aff6da6UL, 0x9dac6ed8UL, 0x376d7041UL, 0xcc597c55UL, 0xd6b538e9UL, 0xae5f1c6UL, 0x13169674UL,
+ 0x8ff7618cUL, 0xb31738e2UL, 0xa3c134acUL, 0x96a43e58UL, 0x4f16a4edUL, 0xbaecf92UL, 0xb5b7f0c0UL, 0xe8aeaa92UL,
+ 0x33c2affUL, 0xb30de091UL, 0x3a5087cfUL, 0x2de23c90UL, 0x1867a9d6UL, 0x287a24fbUL, 0xc3d533a4UL, 0xa98fcfb8UL,
+ 0xc7e7bf17UL, 0xdbb81a89UL, 0x2a40fbaaUL, 0x80ac3e80UL, 0x6c6e1457UL, 0xd39c79d9UL, 0xbcdcd727UL, 0x171b48c5UL,
+ 0x41a91d1UL, 0x50c761e0UL, 0xb7186edeUL, 0x1a1e7014UL, 0xb6013730UL, 0x36bf1a17UL, 0xe63e1c40UL, 0xf79f73bfUL,
+ 0x37a5e6aaUL, 0x406f9553UL, 0x50eadc49UL, 0x7d28e2a4UL, 0xbdcda33cUL, 0xd33e3affUL, 0xdc8841daUL, 0xcca3b91UL,
+ 0x2922b45cUL, 0xcf780ab1UL, 0xe6b35c1aUL, 0xfa9b6383UL, 0x280d77d4UL, 0x71c9a39fUL, 0x549ad991UL, 0x4e8eeb55UL,
+ 0xf5ebb0c6UL, 0x7054b83bUL, 0xbcc48253UL, 0x44869d0dUL, 0x9222bc1cUL, 0x67e99324UL, 0xfc2dcd19UL, 0x920d0766UL,
+ 0x891a9e3dUL, 0xa521a133UL, 0x57f59a10UL, 0xd226827fUL, 0x6079e508UL, 0x6df92bcUL, 0x2d67d029UL, 0xf5b979b5UL,
+ 0x222bbaaUL, 0x13c9b3c1UL, 0x96d9b029UL, 0x36b0b517UL, 0xce8864acUL, 0xa4251ce8UL, 0xb5b10acfUL, 0x24d61ab6UL,
+ 0xb96474cdUL, 0xdf318d11UL, 0xf8f8b919UL, 0xeb026f11UL, 0xb8307de6UL, 0x37257382UL, 0xe9a30520UL, 0xd3a3c045UL,
+ 0x8ec551bUL, 0x9f7ee285UL, 0xcf669246UL, 0x5863b569UL, 0x310b1f6cUL, 0xe5a77b49UL, 0x110816d5UL, 0xbe4af34dUL,
+ 0xb2bafd4fUL, 0xf9c087e7UL, 0x1eac01e3UL, 0x34f34f08UL, 0xc03dab6aUL, 0x393846c9UL, 0x4bbca3f3UL, 0x2212d20fUL,
+ 0x6376f698UL, 0xfb03b04fUL, 0x4292cafaUL, 0xabbcc6e6UL, 0xa77af9b5UL, 0x2124c6d3UL, 0x7693fad5UL, 0x263d0ca4UL,
+ 0xaa0efd79UL, 0x192156d9UL, 0x465d508bUL, 0x452bea1cUL, 0xa2855280UL, 0x8a9dbdcfUL, 0xb7fd1578UL, 0xa9f89932UL,
+ 0x1fbf430dUL, 0x70190568UL, 0xbe8fcaf4UL, 0x8fcf33d0UL, 0x10ebc14bUL, 0xeda624a0UL, 0xb73e8b20UL, 0xf381d393UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x84f1d6b9UL, 0xa2fb3016UL, 0xb8af890UL, 0xbf6b9eb8UL, 0x94734b0eUL, 0xc68675ecUL, 0x2cf01702UL, 0x7d7a65b3UL,
+ 0xad69076fUL, 0x4eb15766UL, 0x6e5a1e6fUL, 0x372a6fe9UL, 0xbb92bed4UL, 0xbb9b19UL, 0xa8d727ffUL, 0x5c887ea2UL,
+ 0x81067402UL, 0xf064240eUL, 0x8a9ce0f4UL, 0xdd1034dUL, 0x69eb41dbUL, 0x6fa57c12UL, 0x133c9b0aUL, 0x1193c945UL,
+ 0x11219e9eUL, 0xd5cce044UL, 0x50730320UL, 0xda04b154UL, 0x1deabc58UL, 0xc6d6c766UL, 0x451fcb66UL, 0x90a1619dUL,
+ 0xfe1b7136UL, 0xab254a71UL, 0x3356df00UL, 0xfe1a4c4aUL, 0xe535ac2aUL, 0xf86e0020UL, 0x99a89ba7UL, 0x6a0a71cfUL,
+ 0x7c507dd1UL, 0x12bde612UL, 0xa8c3534dUL, 0x25d6e1c1UL, 0x18e4a7edUL, 0x8f2ee5a1UL, 0x3a7be619UL, 0xd3bad808UL,
+ 0x10320642UL, 0x31c681efUL, 0x8754463bUL, 0x97c906ccUL, 0x3dc4c53aUL, 0x1f6a11b5UL, 0xc3f787afUL, 0xeb6117a1UL,
+ 0x2c028b33UL, 0x6d584aa3UL, 0x72f5ada4UL, 0xe8a9b0e6UL, 0xcc0b0292UL, 0xa411cfc2UL, 0x68a02615UL, 0x66de1d5dUL,
+ 0x19e5d052UL, 0xd4d49c1cUL, 0x41d3a57UL, 0x395d8aafUL, 0x157ef88aUL, 0x55791080UL, 0xcaf84eb9UL, 0xa999bc82UL,
+ 0xdcebffbaUL, 0xa69fbdadUL, 0x3d6d6accUL, 0x4f181839UL, 0x76e0fb41UL, 0x53c3fda4UL, 0x977b8882UL, 0x774b84c2UL,
+ 0x8f1a8822UL, 0xfb1714f8UL, 0x9b64ce7UL, 0x8af5b373UL, 0x83347e04UL, 0x375fa1c4UL, 0xf8be993eUL, 0x5ae647a1UL,
+ 0x7abe1803UL, 0x273cdcafUL, 0x52571baUL, 0xbc95439UL, 0xb4c270e6UL, 0x8c7aa7e6UL, 0x801d9d30UL, 0xae70a8a4UL,
+ 0xc1590d36UL, 0xedc60851UL, 0xd736aab1UL, 0xc1d06b2fUL, 0xe3f12442UL, 0xe61f29e7UL, 0x1fca6c5cUL, 0x667baa68UL,
+ 0xd1936bf4UL, 0x7fed5791UL, 0x977ab69cUL, 0x699cd762UL, 0xd8fad37bUL, 0x4455d453UL, 0x74de1b09UL, 0x10412c31UL,
+ 0x9367803fUL, 0xce971UL, 0x98e3e798UL, 0x83080165UL, 0x43ed0f02UL, 0x9e266cdUL, 0xf3c04bf2UL, 0xd947f54dUL,
+ 0x49399ddfUL, 0xf6c9700bUL, 0x1c4b0e68UL, 0xe1febce6UL, 0xeaa851c4UL, 0x5bb68975UL, 0x5d01f9f3UL, 0xd9ac8a1fUL,
+ 0x1a07a6cUL, 0x6775d195UL, 0x79690aefUL, 0xe35ada75UL, 0xa942233aUL, 0xc9813498UL, 0xf83e4477UL, 0x5e5d5635UL,
+ 0xe8031bcdUL, 0x64f379d7UL, 0x66f417cUL, 0x59cc9c52UL, 0xd96e1b62UL, 0x9b4a7fa1UL, 0xb209104cUL, 0x4c86b09UL,
+ 0x41caf584UL, 0x3bfc60aaUL, 0xca5e48d3UL, 0x607cc878UL, 0xb5bfc3f7UL, 0xac426e2fUL, 0x3b091c2eUL, 0x46395260UL,
+ 0xae40e0e2UL, 0x4cd6b357UL, 0xe37c761aUL, 0x9bc9b473UL, 0x7a001660UL, 0xbb0f96b9UL, 0x1c4025afUL, 0xd3bb6495UL,
+ 0xf4964f49UL, 0x1362b136UL, 0xd81cd509UL, 0xee6db3cdUL, 0x3f973e74UL, 0x4fe7b6f8UL, 0x1e1b5e31UL, 0xec6f65eeUL,
+ 0x9fe92900UL, 0x20736cc5UL, 0x4a724ce0UL, 0x41a0946cUL, 0x66dd3c75UL, 0x62d794c9UL, 0x40137162UL, 0xdca232f7UL,
+ 0x12bdead1UL, 0xed4a6090UL, 0x532f683dUL, 0xf3f71949UL, 0x1afed6f9UL, 0x3b552d2UL, 0xe2d3802dUL, 0x712c0785UL,
+ 0xf535b6bbUL, 0x113c7377UL, 0xa1c5e3b6UL, 0xb00ccbb5UL, 0x924221a6UL, 0xd97bf376UL, 0x9adab2d7UL, 0xf5966a9fUL,
+ 0x1837dc28UL, 0x6bb06a7dUL, 0xa03b441cUL, 0xc505cabdUL, 0xe4082e94UL, 0xeed3ed1eUL, 0xa7d7ec69UL, 0xf45010c7UL,
+ 0xbc5a1721UL, 0x7be6d48bUL, 0xa41f499dUL, 0xa328c40bUL, 0xc2a56cd9UL, 0xd81af0d8UL, 0x5a7b360aUL, 0xe20135e8UL,
+ 0xf21a0dc4UL, 0xa525b6e6UL, 0xc4ba14b3UL, 0x8c0ad575UL, 0x1adf627fUL, 0xbe8000f7UL, 0xf0bc7e10UL, 0xde21352fUL,
+ 0x47887d23UL, 0xe8435d6bUL, 0x35e19331UL, 0x376ba1acUL, 0xb93620a0UL, 0x393075b7UL, 0xff3ec161UL, 0xd64233d9UL,
+ 0x3072419dUL, 0x5794d62bUL, 0x60d0145cUL, 0x5ee6a7cbUL, 0x991ca01dUL, 0x4e1713e3UL, 0x2b35153eUL, 0x4bb69962UL,
+ 0x9a858630UL, 0xebcdd8feUL, 0x2886b4b5UL, 0xb6588246UL, 0x7ea8940UL, 0x805576b3UL, 0x4d0e7446UL, 0xf8dbe0aeUL,
+ 0xfc83cdeaUL, 0x22b8a390UL, 0xb5aa43d2UL, 0xa2342cb0UL, 0xb9b6a937UL, 0x18107c1aUL, 0xbd49c655UL, 0x2a32765fUL,
+ 0x4c1b7524UL, 0x34929fd6UL, 0xc73943bUL, 0x6a4413e3UL, 0x5d61d43bUL, 0x7892bca1UL, 0x991d0d24UL, 0xaec15f30UL,
+ 0x6de44893UL, 0x36efb501UL, 0x132280f7UL, 0xb250846UL, 0x242d3dc1UL, 0x91aa72e2UL, 0xfa9c1c7bUL, 0x95efc574UL,
+ 0x30d0f066UL, 0x124b9545UL, 0x74c651baUL, 0xa420a85fUL, 0x31a9b2bcUL, 0x46490171UL, 0x3d18f83eUL, 0x50de7be7UL,
+ 0x1ee451d9UL, 0x29db87c7UL, 0x805a2bf7UL, 0x580f5fd1UL, 0x81cf1e18UL, 0x41215eb2UL, 0x3f45c970UL, 0x4e940fddUL,
+ 0x6a849a56UL, 0x9df10eefUL, 0xeb88ab60UL, 0x6ab27080UL, 0x7c5493a0UL, 0xbe134adUL, 0x853a723aUL, 0x1f0fbf64UL,
+ 0xfe81cbb4UL, 0xefa83869UL, 0x3e2c964aUL, 0x280e1fdeUL, 0x9aa2bb33UL, 0x4c9679c9UL, 0x99a7f44cUL, 0x2f166e6fUL,
+ 0xddbc2e5aUL, 0x16ccc45eUL, 0x5cb63bc7UL, 0x12ad2b5fUL, 0xddfb748eUL, 0x2643f07bUL, 0x2e168236UL, 0x169c7734UL,
+ 0x39fcde64UL, 0x3a7b45bfUL, 0x80c7d05fUL, 0x7cb581deUL, 0xd5eed1d9UL, 0x208e6c02UL, 0x4f54b284UL, 0x338b107cUL,
+ 0x8e64be10UL, 0x1c1bdfaUL, 0xf93cfd0bUL, 0x6de1f3fUL, 0x98c7c6a5UL, 0x1c136378UL, 0x2d74621bUL, 0xaf0b6b85UL,
+ 0x8d2baf55UL, 0x5b0e5b7aUL, 0x8f921f32UL, 0xa996843aUL, 0x938cb8c3UL, 0xe82d4141UL, 0x57fac73eUL, 0xc2aa0f88UL,
+ 0x9b3987c8UL, 0x28366b98UL, 0xa8e44707UL, 0xfc2c32d7UL, 0x63baa1eaUL, 0xa1af61b9UL, 0xb468c174UL, 0xe8b8a292UL,
+ 0x7b81fcacUL, 0x62077768UL, 0xb3945de3UL, 0x501d7b3UL, 0xab11934eUL, 0x9f969a45UL, 0xad22d5d2UL, 0x2853e792UL,
+ 0x776c86b0UL, 0xf5a3cbe7UL, 0xa2f4edb6UL, 0x13104c09UL, 0x827c7b56UL, 0x8ef2bcefUL, 0x547f92b7UL, 0xc9c499d6UL,
+ 0x947c7f7cUL, 0xa7635d90UL, 0x5b61df63UL, 0x7be9613UL, 0x700b08c2UL, 0xc48a6697UL, 0x954ff89fUL, 0x53132a49UL,
+ 0x5490a618UL, 0x18c1d904UL, 0x6880d811UL, 0x2fe34588UL, 0x610d37bfUL, 0xf9810661UL, 0xe3a0caedUL, 0x4868eec7UL,
+ 0x9628ddceUL, 0xd93697bbUL, 0x48bb0287UL, 0x4e1fec0UL, 0x83edd9acUL, 0x82a1fb72UL, 0xfffb3b32UL, 0x12a70f6dUL,
+ 0x4a082354UL, 0xfd82e6e3UL, 0xd2fa38deUL, 0x1cfb87e9UL, 0x6f14a9e5UL, 0x68d5d10bUL, 0xba65b54eUL, 0x9bcfb88UL,
+ 0xe86d935aUL, 0xedaae51fUL, 0x41c41e43UL, 0xa19c089eUL, 0x2909b74UL, 0xea26ea61UL, 0x8ee29358UL, 0x45bc64ffUL,
+ 0x366609b0UL, 0x11102ce7UL, 0xc36d99c6UL, 0xc0fbc148UL, 0x6ad53f30UL, 0xf2725303UL, 0xd91a452fUL, 0xfdd2e47bUL,
+ 0x43d8c578UL, 0xcac3ddd1UL, 0xa93e6a5bUL, 0xb49a2790UL, 0xce888946UL, 0x7d8a642fUL, 0xfa6d3fb2UL, 0x36cb9cb3UL,
+ 0x6642f93cUL, 0x17a7ae6dUL, 0xf58ea97UL, 0x10a1e346UL, 0xc5938eb8UL, 0xf48a4967UL, 0xb9710ac6UL, 0x1f9ce115UL,
+ 0xfdcabd4fUL, 0x2e3b14a6UL, 0xe2480794UL, 0xa7944a55UL, 0x1665ccc9UL, 0xd889b88dUL, 0x2896de52UL, 0xf82f3f4dUL,
+ 0xd9fed168UL, 0x70754a54UL, 0x3fc4554aUL, 0x152704f8UL, 0x7d823a1fUL, 0xec63caeUL, 0x9ea6d577UL, 0x24e5dc1cUL,
+ 0x251b120UL, 0x49c7970UL, 0xa13a101dUL, 0x7f99d670UL, 0x55242e62UL, 0x20b0e2a3UL, 0xb0e81440UL, 0x4566b478UL,
+ 0x3328bf14UL, 0xe1c31f73UL, 0x77bad7c2UL, 0xc1f2ffffUL, 0xcdc31c42UL, 0x8f8400b6UL, 0x536003bfUL, 0x268bf934UL,
+ 0x7a0e1ee5UL, 0x7b91fd27UL, 0x28c4b787UL, 0xb913b37eUL, 0x66817e31UL, 0x4c953a0dUL, 0x84860c4aUL, 0xb227c00aUL,
+ 0xb0e679fbUL, 0xe4b0605dUL, 0x26d2029aUL, 0xbaa6f043UL, 0x85bbdf1fUL, 0x836ee1daUL, 0x45220764UL, 0xc9e22db3UL,
+ 0x55807478UL, 0xd74ec8e7UL, 0xcbc74532UL, 0x29808646UL, 0x191c0e60UL, 0xd040c0d0UL, 0xd1491a28UL, 0x22c3e6dcUL,
+ 0xa0bd7562UL, 0x8b9e1077UL, 0xa8399ebaUL, 0x2058a420UL, 0xf35a3b81UL, 0x626d0145UL, 0x31db7335UL, 0x1127301cUL,
+ 0xdc7a537dUL, 0xdb1e55e5UL, 0x2b4234e4UL, 0xfc631847UL, 0x61f4453cUL, 0xe4a80cc7UL, 0xd5afbb31UL, 0x2e1325d2UL,
+ 0x83627a3dUL, 0xd9398bd8UL, 0x787e7c26UL, 0xf6567d84UL, 0x27c7e398UL, 0x709d19eUL, 0xc83f6aeeUL, 0x68294f4bUL,
+ 0x435f9a61UL, 0x52acbf11UL, 0xb1fb6e56UL, 0x2a37d2e6UL, 0xcfa65a98UL, 0x230dcee5UL, 0x3dd4f0acUL, 0xddf65160UL,
+ 0x4288cfb8UL, 0x75de87a6UL, 0x8651934UL, 0x8e5415d9UL, 0x68bcfc73UL, 0xaa9c33bbUL, 0x2ccf12cfUL, 0xf032770dUL,
+ 0x70d74202UL, 0xd0781b16UL, 0x9d0a35ecUL, 0x5b88eb6UL, 0x3de149a3UL, 0x4bec0211UL, 0xa5be186aUL, 0xc9089280UL,
+ 0x29296989UL, 0xd6371828UL, 0x47ae2068UL, 0x89a77d47UL, 0x8bbe2354UL, 0xe7503c05UL, 0x68e6966dUL, 0xd89275a6UL,
+ 0x7582e453UL, 0x2260793cUL, 0x1c3d4fcaUL, 0x60741d6UL, 0xa0a1c8d4UL, 0x56098e87UL, 0xae969e12UL, 0x50977dc8UL,
+ 0xf5838bb3UL, 0xe23e8202UL, 0x5b91648eUL, 0x82b3778cUL, 0x92b9a478UL, 0xf2a108feUL, 0xe327c0f6UL, 0x7ce5b67cUL,
+ 0x868d0847UL, 0x548c681dUL, 0x59474fb4UL, 0x2a9c6498UL, 0x8036ddeeUL, 0x98258309UL, 0xfba0788UL, 0x7c234848UL,
+ 0xdce3a00cUL, 0xcf489913UL, 0x372e9a1eUL, 0xcda4fe69UL, 0xc8954807UL, 0x7486177cUL, 0xe00d941aUL, 0x8da091e9UL,
+ 0x9fab9b38UL, 0xacce6cf5UL, 0xb54a074dUL, 0xe5430c86UL, 0xf3911ce5UL, 0x594d87d4UL, 0xb1f277c8UL, 0x3fbc9f4bUL,
+ 0xb20728f1UL, 0xf9c14c90UL, 0x436092fcUL, 0xa967fe5bUL, 0x3cf3cfaeUL, 0x5f80becUL, 0x312ddbf9UL, 0x2b926ee2UL,
+ 0xb72253ecUL, 0xcda9d94cUL, 0x57826f4aUL, 0x2e795388UL, 0x20ad5068UL, 0xa8c22208UL, 0xcc68a0b1UL, 0x2991c1f4UL,
+ 0x37912de5UL, 0x3b1d0b0cUL, 0xb769773bUL, 0x33d8346eUL, 0x6928834bUL, 0x5dc351b1UL, 0xf6afbe69UL, 0x64faffaUL,
+ 0x5af18b45UL, 0x73769de7UL, 0xc9b44422UL, 0x8f734115UL, 0x26b5cc5dUL, 0xb9d932f8UL, 0x125af091UL, 0xfd0e23c7UL,
+ 0x5c073902UL, 0x15b6526eUL, 0x35ae488aUL, 0xde5c15f4UL, 0x730aee3eUL, 0x6bdad990UL, 0xca8e8144UL, 0xfac4ccaUL,
+ 0xfd4e7f8UL, 0x41b8843UL, 0xae758f99UL, 0xcdf389d9UL, 0x6308492aUL, 0x3fbe26ffUL, 0x6f8f2ad8UL, 0xe3bde23fUL,
+ 0xdadd5eeUL, 0x2750495dUL, 0xc5e68ab7UL, 0x60aaf98cUL, 0x39e6dd6fUL, 0xe528b22eUL, 0x3dd4920cUL, 0xc20cce67UL,
+ 0x658b34b1UL, 0xf45fc486UL, 0x25d0f4adUL, 0x8236a8ceUL, 0xdc74ea84UL, 0x4ef8016cUL, 0x3bcdd92bUL, 0xefce5f55UL,
+ 0xf577d810UL, 0x5ad292a7UL, 0xf3fa382fUL, 0xd9e87f03UL, 0xd305a86UL, 0x919cb5dbUL, 0x31e36c9aUL, 0x39021ca4UL,
+ 0x7b9f70c2UL, 0x73cee9fcUL, 0x4b039b00UL, 0x7dc18ee7UL, 0xb5f1bcf4UL, 0x4a0f2b10UL, 0x2a63aa0aUL, 0xb6ba396fUL,
+ 0xb87bec1aUL, 0x1b5fdd24UL, 0x7f98a549UL, 0x970e9d33UL, 0x74b9f804UL, 0x375a4fdUL, 0xaadc239aUL, 0x6008f35fUL,
+ 0x6198d86bUL, 0xff4db58cUL, 0x72a11149UL, 0xbb1a9820UL, 0xa420717aUL, 0xce7b4b3aUL, 0xbad202a1UL, 0xf43a3283UL,
+ 0x7aba1c13UL, 0x4c7fe6a5UL, 0x9d77ab46UL, 0x67f07a56UL, 0xa67bb749UL, 0xc49bd563UL, 0x74094bbdUL, 0x6ddb852cUL,
+ 0x69b38812UL, 0x16e1f649UL, 0x3a446c77UL, 0x3ffc1042UL, 0x358cf4b1UL, 0xa48bf502UL, 0xf9796f69UL, 0x3caf4cb1UL,
+ 0x7be9aecbUL, 0x287d5b8dUL, 0x7d34daf6UL, 0xb42a2a78UL, 0xc7717a53UL, 0x141b50dcUL, 0x45b20dd6UL, 0x2f39ebc3UL,
+ 0x5b4a49fcUL, 0xaf2d3a63UL, 0x7b7095cUL, 0x97289384UL, 0xacad9169UL, 0xc266fa26UL, 0x305b98bcUL, 0xa57e8a77UL,
+ 0x79308268UL, 0xa4fa207bUL, 0x741ea985UL, 0x36ebd34aUL, 0x5dedc394UL, 0x7fd7652UL, 0x3ed42783UL, 0x67173aa6UL,
+ 0xbb32d2fbUL, 0xc53d4fb0UL, 0x20c1f8a7UL, 0xeeb4f532UL, 0xb122dcfeUL, 0xd6a5995dUL, 0x13cbfdbaUL, 0x38e7f89fUL,
+ 0xfad6d7b3UL, 0x1bf6ccfcUL, 0x665c17f8UL, 0xaf3dd3b0UL, 0xca50bb3cUL, 0x2d40e2a9UL, 0x351416b5UL, 0xc29db14cUL,
+ 0xae7a6e1bUL, 0x18d17f8aUL, 0x8d171d4cUL, 0xa43d0b0aUL, 0xe03b3c5aUL, 0x1e86d121UL, 0xbd1a52bcUL, 0x708c7b8dUL,
+ 0x5f8a8192UL, 0xdd3a473fUL, 0xb9da8998UL, 0xa80d9f21UL, 0xa32e0f38UL, 0x257a92eaUL, 0x2261178eUL, 0x9f1e8d9fUL,
+ 0xb01b74d8UL, 0x6cc33e93UL, 0x440565f1UL, 0x32b9ff80UL, 0x6d2018d5UL, 0xeb26d327UL, 0xbba6c373UL, 0x82a5b921UL,
+ 0xcf75e256UL, 0x722b4286UL, 0xbb53398bUL, 0xf61b96daUL, 0x90f87fa9UL, 0xd0be6174UL, 0x4988a9eeUL, 0x653a1ee1UL,
+ 0x848d4a64UL, 0x7dabe354UL, 0x8d55cb5aUL, 0x3bfcb7d8UL, 0xd1593414UL, 0xd7e0a489UL, 0xcb749ff7UL, 0x67329c6UL,
+ 0x2c5a3a51UL, 0xeefba431UL, 0x2ca4ec1fUL, 0xa6ddf9c0UL, 0xe75a3effUL, 0xdbd6c91cUL, 0x5c858dc6UL, 0x39a3d182UL,
+ 0xe6f4c171UL, 0xab6e1a8aUL, 0x5493e75UL, 0xc9ff7129UL, 0x1d0fc5abUL, 0x23f6321eUL, 0x8a957601UL, 0x12a7d2cfUL,
+ 0xa4f5d5a7UL, 0x58f13af4UL, 0x2ae9b7a7UL, 0x5a6dcc76UL, 0xcf2bbbe2UL, 0x5c0a4e49UL, 0xe398d70UL, 0x7a78e684UL,
+ 0x5d0d4eaUL, 0x666b9cc5UL, 0x484a4c6bUL, 0x15ae9a20UL, 0xf29082d3UL, 0xfda176a7UL, 0xbe84f6daUL, 0x23bab284UL,
+ 0xaafc131eUL, 0x1b610e17UL, 0x5a1cbe6UL, 0x825833f4UL, 0x35ed7f2bUL, 0xa2db8034UL, 0x85bd816dUL, 0xc5e15c6fUL,
+ 0xa6750095UL, 0xa7f64f82UL, 0xcf53c419UL, 0x2882d90UL, 0xeba99e0fUL, 0x19505847UL, 0xdb2830c7UL, 0xd02316e6UL,
+ 0x8b63be91UL, 0xef0503a9UL, 0x8158a2e6UL, 0x35dc89aeUL, 0xc1b00176UL, 0x55b858bcUL, 0x75160660UL, 0x9a217bdUL,
+ 0x14fabda9UL, 0xcdb84b8UL, 0xe0d2dfc0UL, 0xf849613aUL, 0x5a044f53UL, 0x6a05bd11UL, 0x1c7560aaUL, 0x9048cf75UL,
+ 0x5e4e9b94UL, 0x85366d8UL, 0x3ee17611UL, 0x9c85d589UL, 0x8f3fa44dUL, 0x6b00dc98UL, 0x516ea07eUL, 0x5dea062bUL,
+ 0xbb817671UL, 0xca604bf8UL, 0x9ffde149UL, 0x4ad33f10UL, 0xfd9bbb10UL, 0x70988b1eUL, 0x93cd8b3bUL, 0x35e79caeUL,
+ 0x1b1ec066UL, 0x75aab067UL, 0x966ab3dUL, 0x32dcfd0UL, 0x5128f15bUL, 0x24e36716UL, 0x543d0b3eUL, 0x96578b8dUL,
+ 0x7117e577UL, 0xdf76e345UL, 0x343ab845UL, 0x240c560bUL, 0x65ab407eUL, 0xeb75aec6UL, 0x2adc24fUL, 0xb719c89UL,
+ 0x8ed773e1UL, 0x3995e75dUL, 0xf2105e2eUL, 0x23bf8a4UL, 0x41cefccdUL, 0x6ca5fedUL, 0xf9cabeb0UL, 0xb250cf7eUL,
+ 0x5a1d3972UL, 0x50463edUL, 0x29e9b9bUL, 0xcadf972UL, 0x16abd3eaUL, 0xa4d4808cUL, 0xa2bea6b7UL, 0x2d418892UL,
+ 0x594a0883UL, 0xd37fd64aUL, 0x6c287839UL, 0xae4fa7d0UL, 0xa663fb57UL, 0x5a29f762UL, 0xd5129174UL, 0xd9cb60abUL,
+ 0xa7b7360UL, 0x71f97575UL, 0x601d8552UL, 0x72041c6fUL, 0x9cdf88cfUL, 0xcb8b26ccUL, 0x155811f3UL, 0x912a8e24UL,
+ 0x7c3b65aUL, 0x9d2fda3cUL, 0x8a7c4ae9UL, 0xdc7561c3UL, 0x2d9e31abUL, 0xb18c60f6UL, 0x8f6ae080UL, 0x4ad19194UL,
+ 0x9b01586cUL, 0x57968cf8UL, 0x8d735c7aUL, 0xaa8811a6UL, 0x2e1ed2e4UL, 0x167ba8caUL, 0x84a9693eUL, 0x151a49afUL,
+ 0xf5ce2456UL, 0xf369d4fcUL, 0xb733445eUL, 0x1d7aaa39UL, 0x85e876d2UL, 0x2a89aad2UL, 0xcc102ddUL, 0x398b14f7UL,
+ 0x4f7c4f2eUL, 0xdbad68f3UL, 0x6aee4b14UL, 0xbea100f1UL, 0xe98c7e57UL, 0xbb2359eeUL, 0x15c8f8f8UL, 0xa95b0515UL,
+ 0xf9969415UL, 0xce3c15ceUL, 0x8685ba80UL, 0xab73c5f0UL, 0x17ec044UL, 0xab2f0174UL, 0xc1665b5fUL, 0xbdbbe145UL,
+ 0x575c2ba0UL, 0x63a2313aUL, 0x1391419aUL, 0x3b7c246UL, 0x40a2976aUL, 0xf966cbfeUL, 0xf1057e80UL, 0x560dd4d1UL,
+ 0x9b16e7f3UL, 0x5d25fd5fUL, 0x2df08e9eUL, 0xf7879d89UL, 0x86db39e9UL, 0x2aa8a608UL, 0x682303bcUL, 0x3ce23adfUL,
+ 0x4eaf1c22UL, 0xc4cbadc9UL, 0xc7d28272UL, 0x87a904b3UL, 0x5587eb55UL, 0xc105839dUL, 0xf34e4e5eUL, 0xfa476cfbUL,
+ 0x49c189fdUL, 0xab0d4657UL, 0xfe20f500UL, 0x10ace78UL, 0x8e98d07cUL, 0xd7fe6d81UL, 0x19e90bf6UL, 0x62f27376UL,
+ 0xd41dc4ecUL, 0x107a7a9fUL, 0xbc79efbUL, 0x36c50792UL, 0x67b31b42UL, 0xb24c3a38UL, 0x4f2ea97UL, 0x92c644baUL,
+ 0xca7f8597UL, 0x29f05a39UL, 0x119fd99aUL, 0x3658360cUL, 0x38544949UL, 0x1bedd190UL, 0x1b089b45UL, 0xf8881048UL,
+ 0xf36d613eUL, 0x84733695UL, 0xd0e7e60eUL, 0xea32a1d3UL, 0x9d0f11c4UL, 0xf018be15UL, 0xf6986253UL, 0x13b8a8dfUL,
+ 0xa3954601UL, 0xcd6c55a3UL, 0xb44a2de4UL, 0x625efc8UL, 0x812459e5UL, 0xeefef48fUL, 0x51299ecfUL, 0x58f07f58UL,
+ 0x3d5a74dfUL, 0x4f1ab725UL, 0xd9cf0a3eUL, 0x91d418aeUL, 0xc2f4d52bUL, 0xea45c484UL, 0xf15384aaUL, 0x6bb51dbbUL,
+ 0x22753b51UL, 0xc2081d24UL, 0xf3beada6UL, 0xfca3e2e2UL, 0x1cd6ca20UL, 0x5ab1f143UL, 0x4c73315aUL, 0x1c40a0a3UL,
+};
+#endif
diff --git a/lib/nettle/gost/ecc-gost256cpa-64.h b/lib/nettle/gost/ecc-gost256cpa-64.h
new file mode 100644
index 0000000000..64659d7adc
--- /dev/null
+++ b/lib/nettle/gost/ecc-gost256cpa-64.h
@@ -0,0 +1,1071 @@
+/* For NULL. */
+#include <stddef.h>
+#define ECC_LIMB_SIZE 4
+#define ECC_PIPPENGER_K 11
+#define ECC_PIPPENGER_C 6
+static const mp_limb_t ecc_p[4] = {
+ 0xfffffffffffffd97ULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL,
+};
+static const mp_limb_t ecc_b[4] = {
+ 0xa6ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+};
+static const mp_limb_t ecc_q[4] = {
+ 0x45841b09b761b893ULL, 0x6c611070995ad100ULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL,
+};
+static const mp_limb_t ecc_g[8] = {
+ 0x1ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x22acc99c9e9f1e14ULL, 0x35294f2ddf23e3b1ULL, 0x27df505a453f2b76ULL, 0x8d91e471e0989cdaULL,
+};
+static const mp_limb_t ecc_Bmodp[4] = {
+ 0x269ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+};
+#define ECC_BMODP_SIZE 1
+static const mp_limb_t ecc_Bmodq[4] = {
+ 0xba7be4f6489e476dULL, 0x939eef8f66a52effULL, 0x0ULL, 0x0ULL,
+};
+#define ECC_BMODQ_SIZE 2
+#define ecc_Bmodp_shifted ecc_Bmodp
+#define ecc_Bmodq_shifted ecc_Bmodq
+static const mp_limb_t ecc_pp1h[4] = {
+ 0xfffffffffffffeccULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0x7fffffffffffffffULL,
+};
+static const mp_limb_t ecc_qp1h[4] = {
+ 0x22c20d84dbb0dc4aULL, 0xb63088384cad6880ULL, 0xffffffffffffffffULL, 0x7fffffffffffffffULL,
+};
+#define ecc_redc_ppm1 NULL
+#define ECC_REDC_SIZE 0
+#if USE_REDC
+#define ecc_unit ecc_Bmodp
+static const mp_limb_t ecc_table[2048] = {
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x269ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x9271ea7a4d82b411ULL, 0x208fd58ecd7fc5ecULL, 0x1938a990e53fbfe6ULL, 0x349f96764fd209caULL,
+ 0x2bf67a05728711ccULL, 0x76ed8b3b9fa7d47eULL, 0x215fcb7a4cfb5354ULL, 0xcd2781d71d77b1a3ULL,
+ 0x9a91dea94d370488ULL, 0x23d14b45d22a568eULL, 0xb27f033157ab7e3bULL, 0x6c130a7391bc69c8ULL,
+ 0x38716a2110a3e30aULL, 0xb3fec3734143e9b7ULL, 0x1e856e03ef98c1d3ULL, 0x50001284b7fcef5aULL,
+ 0xccf91cab5b8cc67bULL, 0xada71d722b34e17fULL, 0xd37764fa9478dedcULL, 0xa81e89e53194e2e7ULL,
+ 0x118e2615e3e91a75ULL, 0xfca8412a89d423e4ULL, 0x97294ae78b3862d5ULL, 0xb8c0af6439f1c564ULL,
+ 0xdc5d9e1161a1097dULL, 0xa13cd3d69fc2cb97ULL, 0x6cef39fddae719b6ULL, 0x8d8bc1d1610dccabULL,
+ 0x6e48523a361f0595ULL, 0x670ec0346eb68ee4ULL, 0x9eec9e6bdc314120ULL, 0xde69cf788a688775ULL,
+ 0x2e511af79d332137ULL, 0x406e861fdcf09ca0ULL, 0x2cdb4bb0180f0d9eULL, 0x9cf943f5f45ce549ULL,
+ 0x67e514258ae191ffULL, 0x6bd19217f03dfddeULL, 0x69afc1805bb405d9ULL, 0xe4a43fa986b9c0e6ULL,
+ 0xf1167f5185339ca0ULL, 0x2c39994829a59cafULL, 0x220adb90e4970522ULL, 0x52ebab4bda5cd9e9ULL,
+ 0x25664db63a43e2e6ULL, 0xb6b22958b80668deULL, 0x404ee6730e6b7dedULL, 0x2ee7630c845317f1ULL,
+ 0x47886e8ef4d39181ULL, 0x4dc741d3244eae3eULL, 0x630ae501953bf381ULL, 0x66685f2e5f534880ULL,
+ 0x1ad07a2cf090c066ULL, 0x7fa9a256f9ea65abULL, 0x2ab27ff93d57186dULL, 0xdadbd78d164d727eULL,
+ 0xca46effdb5f2ed49ULL, 0x57ccd31aed472a4fULL, 0x948c0a8e3627d5e3ULL, 0x8ecc58d0f8217340ULL,
+ 0xf9ef27ce9fd8fe8eULL, 0x5a10eed217b18e43ULL, 0xcd576050ce192e1aULL, 0xe18fabf2a1ce977dULL,
+ 0x1e57872ba1c5537ULL, 0x2e44ed16e952cffaULL, 0xe656b197d941ee1dULL, 0x7e4c31e6b871cef1ULL,
+ 0xf06d9aa939bde1f1ULL, 0x444526c528412a0fULL, 0xfa0481ad05ea5418ULL, 0xef29d5d94657d686ULL,
+ 0x2ddb0d46658b29a8ULL, 0x8df06eaa346bc48dULL, 0x32cc97879cdbf831ULL, 0xae091f0294625f7aULL,
+ 0x250a175e2015a836ULL, 0x2e3fac7b7087271dULL, 0xf983267620a58520ULL, 0xbc26dfaf8690da3dULL,
+ 0x1610fe045ecd84fdULL, 0x2e9024ebeb63b248ULL, 0x200cd2627d3ff71eULL, 0x7f77475897017e79ULL,
+ 0x942a28a7dc5ba08cULL, 0xe21dbb711fc8e2faULL, 0x38d01e75ac117881ULL, 0xcd493d095bf01f6cULL,
+ 0x3a01b011b806248eULL, 0xffb181284dab6535ULL, 0xe5bdb9ee7f9ba8dbULL, 0x699680be1054129ULL,
+ 0xcc181b75e5331d9bULL, 0xc711a68ff85a9fddULL, 0x23b5711c01bc7188ULL, 0x1a07b3adfe73dce0ULL,
+ 0x7f34257fabaf5878ULL, 0x14e56d428d9d5a09ULL, 0x9f9b33c379b20e74ULL, 0xb1865ed8bed0b30cULL,
+ 0xe9cb187b456f4b19ULL, 0x6fe8dc92aaf26c8eULL, 0x451a636256f0b914ULL, 0x3d0a8861dfed5e14ULL,
+ 0xf3e02527192b28faULL, 0x6c44b09da40b1e85ULL, 0x7236985716da6101ULL, 0x5de340be2b6b991dULL,
+ 0x407dca1698e0b4d9ULL, 0xf8e65953c351a1d3ULL, 0x54ce60fa0e65cfe2ULL, 0xa74aa64af3a50f67ULL,
+ 0xab330f4c660e79acULL, 0xe0294d8ac0b53240ULL, 0xeaee8e04cdc5352ULL, 0xf22c62e6849cc804ULL,
+ 0xd0f26fb20f7ac4a2ULL, 0xc390cbd9ee6ee9b2ULL, 0x7fa9f053e0d08be3ULL, 0xf2e59e434987d9a4ULL,
+ 0x3028051f2f8d72b9ULL, 0xf085842ac3feb20fULL, 0x14f2ac6ec909ff85ULL, 0xbf23f0555d876f76ULL,
+ 0xa4800ae87ba388f6ULL, 0xa46d48e007ca568aULL, 0xbcf584103e6a244fULL, 0xb110a240b80c6195ULL,
+ 0x13e275be095f8cc0ULL, 0xace28be33c9e52d6ULL, 0x9765dd4f0dec582bULL, 0xe2cae5ef745a2beeULL,
+ 0x76ca667360e50aa5ULL, 0x2649e8fc40aa6b5cULL, 0x6ac4a7d176bca9beULL, 0xc405bcdbfa74036ULL,
+ 0x2ab1d80b588fdc25ULL, 0x429e0579ba90d19fULL, 0xadedba7f5e7577a7ULL, 0xdf0da4e3a048f3c5ULL,
+ 0xb9d5b41c4d6c2cd8ULL, 0x1421d1f5f23a0223ULL, 0x6e8ebd100e2abaf6ULL, 0x5b9ae22ac8647411ULL,
+ 0x983c8368a38f3071ULL, 0x233fbf695b2bbee8ULL, 0x17d934f7ca0335e3ULL, 0x7565983cc06743f4ULL,
+ 0x646af82e6314a24dULL, 0xb9b00eef11cfb7e4ULL, 0xfc21c7172a042843ULL, 0x312cc9400aec0733ULL,
+ 0x264bbdfd3a1f52e5ULL, 0x35785259567f8c84ULL, 0x776bc00eaf644aaeULL, 0x1d26554f1d4eddaaULL,
+ 0x890ec95356840d1dULL, 0x9a022c3a7200d3bULL, 0x36d442313118b696ULL, 0xf8f5d22f7267d2ceULL,
+ 0x2b8ebec003915375ULL, 0xd6e12a60d486b5f8ULL, 0x574567de0580f679ULL, 0x65ddb7d56467220aULL,
+ 0xc2c320eb3939af9eULL, 0xdb315e6a99394292ULL, 0x437bfbafa113dfc1ULL, 0xd0133206cb9e34faULL,
+ 0xd57a3a7e624135eaULL, 0xa027f66d33c317e5ULL, 0x711d7d8e0aa565f0ULL, 0x42f4637c54a7fa07ULL,
+ 0x49a8896e82f0d659ULL, 0x21d6976c71f18a21ULL, 0xb1e33a7b33593204ULL, 0x23ed8b167e1bacffULL,
+ 0xf4a17bbf996f17bdULL, 0x6d660c7473176ea4ULL, 0x1fc7363cc1f301a9ULL, 0xd64c1ea11aeb1cacULL,
+ 0x7a10b45419a7b7d1ULL, 0x33010367abc1089aULL, 0xd05fbd254f7585fULL, 0x5d6cdd2202314e4dULL,
+ 0x5a6090a4f5be2b44ULL, 0xc59e34183bdf0f7aULL, 0xfc6633a5e016972aULL, 0x8d60a1b51093cff1ULL,
+ 0x169f5b89f3ae8e88ULL, 0x271eec074d17e77eULL, 0xad6796462bb1d8a2ULL, 0xebeb80c95fd7b64ULL,
+ 0xabbbd5bcfa36bf48ULL, 0x2b5d07789ec958ceULL, 0xdb1f82c56803e501ULL, 0x5bad5c2bee268faeULL,
+ 0x212232ec596f90c1ULL, 0x6978467443e00b35ULL, 0x3c7da9351be7ed60ULL, 0x9ca00a1d46f20e66ULL,
+ 0xbdbfe58e443410f6ULL, 0xc063e88cedcfbfd9ULL, 0x9bc602626637501dULL, 0x29812e11fada5d51ULL,
+ 0xa9210e1f2098f86bULL, 0x1ac8879772c513bbULL, 0x9fce8de80958390bULL, 0x74010dfb5d430ba4ULL,
+ 0xd3cb573c975c8121ULL, 0x9ea6698992ac3fcbULL, 0xe7022fdc7fbf52aaULL, 0x6eda69b2948e46b5ULL,
+ 0x8fb94d4ca504ef6bULL, 0xfe2944b4f5b017f1ULL, 0x7a370f320a16d10fULL, 0x5bcbc4a14ce512e0ULL,
+ 0x27a4de873350304aULL, 0x40861f3c51c7f8d8ULL, 0xaca17208c6aa00e1ULL, 0x5df902e3f7837dcfULL,
+ 0x6d5b679f3aae99dULL, 0x336e1cfe367f377ULL, 0xdb7b9bd7b7de4d64ULL, 0xe88a4c9f48d4da0dULL,
+ 0x793c120d3ad847d5ULL, 0x5236130814049d6ULL, 0xb4e673609ed7a755ULL, 0xc473137ed3ee2b76ULL,
+ 0x5abf387ff0ed5a00ULL, 0x1491865682649336ULL, 0x26238d5657514911ULL, 0xc4bc7e13410f3e86ULL,
+ 0xf4ea8b9441f25a81ULL, 0x2ce3f801d608bdb4ULL, 0x31865e0bd00ad1b7ULL, 0x2f1144f05202e234ULL,
+ 0xb8e0a33236e5f242ULL, 0xf962e100b0c07619ULL, 0x3a289a8054ecb1e1ULL, 0x2871e76486688f9fULL,
+ 0x13d4767bd1e31b99ULL, 0xf8adfc0e5c89cb7cULL, 0xfa7b27682519714ULL, 0x389cbed13f1c1360ULL,
+ 0x4c65f97676b8c9bdULL, 0x2dbfc4d5aadb6e6eULL, 0xe5643b3ae30d1f5bULL, 0xad7577d459deab9ULL,
+ 0x10ac7e9e08fc2d7fULL, 0x53aa93b9dd8ed8d6ULL, 0x5930c396c9d2398eULL, 0x6a1d27e16c90cf02ULL,
+ 0xa1f3e69f57accd02ULL, 0xdfad27c9b403bd29ULL, 0x91b03c258ee91a95ULL, 0xa89db7498c1ee669ULL,
+ 0xab448a185b674f01ULL, 0xcdf04197ffcacfa2ULL, 0x543996c7f79694caULL, 0xcfedab0cebfc347bULL,
+ 0xb712809e7f9855f3ULL, 0x80ff8036b592cd9bULL, 0x6a692f32267599adULL, 0x663320a44a15b3e6ULL,
+ 0x43841149208f854bULL, 0xa98a0ee4327269dfULL, 0x4113211ae85b3aa3ULL, 0x4ed8e6f76ba93ed7ULL,
+ 0xb59f6e5a1801a18ULL, 0x26017587b47ea2b4ULL, 0x3b273de239876468ULL, 0xdacdb05364ceb9d2ULL,
+ 0x6eeb71cef86c93a0ULL, 0x55fdffa4015d4c51ULL, 0x303e824934de500cULL, 0xde8bf01462911a41ULL,
+ 0xffd2bbe198f93f1aULL, 0xcdacf9055e3b63eaULL, 0x917ef59dc885a310ULL, 0xb46f86b66d8d2bc1ULL,
+ 0x8937bd6aab03b344ULL, 0xfea838dd66f51dcULL, 0x823dcd1dc12475afULL, 0xb81d6cc47a8c8db1ULL,
+ 0xf03afe9ff5b48650ULL, 0xe051800edf5e2a63ULL, 0x3a20c21856fe615ULL, 0x6b43fbe0505bb8d1ULL,
+ 0x59380a2875fe00f0ULL, 0x24a8e6e29e2ad555ULL, 0xc5846725b54e2b8fULL, 0xe824b8bfe12ed89aULL,
+ 0x14767aec3e1802c1ULL, 0xca384097f7dd8eefULL, 0x35f9f188e89ed164ULL, 0x426e51b23d5dea4dULL,
+ 0xd2ae6f160031fe7bULL, 0x8a678694bde6d329ULL, 0x482d533ca30bfeaULL, 0x966b23b15645dc5eULL,
+ 0xddddce217141d85dULL, 0x28f9584c61a01285ULL, 0x6d1ef9232d18de6aULL, 0xc27800bd93eb7e69ULL,
+ 0x13aead1109ce2ee9ULL, 0x9bd1deddaf9cdc33ULL, 0xf300b32da0fbe620ULL, 0x2a7235bf97fd23cbULL,
+ 0x9f590135241838d4ULL, 0xcb767b59f5aa1315ULL, 0x50fdb0e24cba6db8ULL, 0xd303a00e4fa6ed5ULL,
+ 0x12124b5fa6735629ULL, 0xf57f1c6080621d43ULL, 0x498f365597e3d405ULL, 0x4198a0880d0c473aULL,
+ 0x41f92d9f5b613c9cULL, 0x591f9ea7368a3021ULL, 0x34c459af90f5233cULL, 0x470f0e4410e0f8bbULL,
+ 0x467afdda14325578ULL, 0xea95ad39c1890886ULL, 0x6a7dd15e729e076ULL, 0xaac209177339650bULL,
+ 0x396fe67b44a83c63ULL, 0x92bb09af2dda4e65ULL, 0xb1bc3afb7728d3c3ULL, 0x6007a0fdff4b2e5aULL,
+ 0xdf83c0435b7be8bULL, 0x472e05c393bc97c5ULL, 0xa54d861e52b40ad1ULL, 0xe263a27e866e2c0bULL,
+ 0x2bafbe29b657322cULL, 0x143d4706884a70a3ULL, 0xa816e2e1ea7ee0aeULL, 0x6315365c18aa357dULL,
+ 0x13906a3b99cc35a0ULL, 0xfabc897871b81dceULL, 0x876b9a6faedfa64ULL, 0x6a68e4688f0d63adULL,
+ 0x4a2b0048b403e429ULL, 0x2e0935b5c6150ecdULL, 0xbdf6c83c7debd05eULL, 0x435abceb52d9d52fULL,
+ 0x92447341fafd9df1ULL, 0xfc997ab53a536dbbULL, 0x699d8f0d3d0efcb5ULL, 0x274074b6e448e005ULL,
+ 0x3aa71004f297004eULL, 0x419be67b179c9df8ULL, 0xdeb43366c8285fd9ULL, 0xbfa1c616cc2eb843ULL,
+ 0x6b05535098eacf45ULL, 0x3e093c5db9418315ULL, 0xd283567478d31971ULL, 0x7ba8043aba446884ULL,
+ 0x300c0243bc4fee0eULL, 0x30fdcf8a6c6fe657ULL, 0x928da0d04d3635c6ULL, 0x14aad129e2d506edULL,
+ 0x95b64457fc50d416ULL, 0xb60952ac39708fa7ULL, 0x602dc88bd71b560fULL, 0xef5860622ec7eae0ULL,
+ 0x87f880d29c2a7cc8ULL, 0xd3073f4edd460972ULL, 0xe82fc8d2416f46c5ULL, 0xe614fa0e932e63fbULL,
+ 0x18469eaa85a3c495ULL, 0x65dcf1f57f5f89f6ULL, 0x51fc52864889192aULL, 0xce31347024ef546cULL,
+ 0x667b04ac8ace1d03ULL, 0xe3821445892a3b23ULL, 0x813c8cf5406d4316ULL, 0x8e168bfd5bfd2a74ULL,
+ 0x302a42674df44ce9ULL, 0x44acf5e28cdc9a39ULL, 0xc43e314d0b6aae8bULL, 0xd40fc2347cdcb9f5ULL,
+ 0xc42a0f622d8ccd6fULL, 0xfa89c396b452f554ULL, 0xc1d3eda656a0dcdbULL, 0x6c28b299748c4570ULL,
+ 0x220d85cd431f9da8ULL, 0x7137865bd8e986f7ULL, 0x40f4816ffdcf73cfULL, 0x27ec5aaba94e3e89ULL,
+ 0x132a0bb706b5c6ccULL, 0x5d5b13b98250c5efULL, 0xbcc299e2b819a95bULL, 0xc29bfe4ff10d30daULL,
+ 0x323adbda4d45742bULL, 0x1dc21f96d0e19ef7ULL, 0xf81749bcad440048ULL, 0xc99fc7ac62406daeULL,
+ 0x469bfc9c0698785cULL, 0x1b965adba2a19476ULL, 0x44037736c35cc9c1ULL, 0x350c8cd54a3f2a8eULL,
+ 0xf77a8cc34089944ULL, 0xe1d77cdfb5087a61ULL, 0x97b974783aac726fULL, 0x96ca87015bdf1a1fULL,
+ 0xdf7eff6c1df718d3ULL, 0x59dbb1a5cca715efULL, 0x8f7109c8e0d88785ULL, 0x921927ef33c9d8fbULL,
+ 0xa1ef0a50a53a1721ULL, 0x33b32fbf40f6d98aULL, 0x75409c58b41dffaULL, 0xd7c6839f497d5d6eULL,
+ 0xdadac1ac795ec55cULL, 0x4aeac5cb393daa4eULL, 0xb2242fb89405b4caULL, 0x64aa521be1f9985bULL,
+ 0x765ea8ed92bb1ca9ULL, 0x156d97863f777985ULL, 0xdeab8be3438523fcULL, 0x91a320ee529c49c3ULL,
+ 0x504d3c6fe60c8336ULL, 0x5f026f03d6a9bd5cULL, 0x91bbc86d6223af2cULL, 0x30dbe84d93db3f24ULL,
+ 0x52ae46e34645ca83ULL, 0x42e0f6fa5f096586ULL, 0xd10150d17e7f21c2ULL, 0x72c6d74ef25f18b1ULL,
+ 0xdc17532dcfe500cfULL, 0xe0308654cfe854c0ULL, 0x202983dfba634e2aULL, 0x92fe3b36643dbdcdULL,
+ 0x8ce45f20340f6787ULL, 0x68de585575d645a8ULL, 0xcb9a74fd8e8b3d41ULL, 0x57da11ab32be0a2fULL,
+ 0x991a7283b9c4ab8aULL, 0xbf5700c355856053ULL, 0xed006142a072aa0dULL, 0xc4a469e0dc4f693fULL,
+ 0xeb16bd21edbb4607ULL, 0xe2508329f5754b09ULL, 0xe2e97d41c358f47ULL, 0x9506e5f3e90babcULL,
+ 0xc17f446f53e829bdULL, 0x5382c4876a4532a0ULL, 0x6f6d2731034bc2dbULL, 0x74c5510fe0fd57baULL,
+ 0x8bbd675890b8225aULL, 0x16477d0bc6b4150bULL, 0x320e61b0a664d93bULL, 0x622631b677b6c1a0ULL,
+ 0x36a545a050419c7bULL, 0x1c5f7138572af62aULL, 0xddc58702d5958b1bULL, 0x48dbc853922173d6ULL,
+ 0x274259ab59c547faULL, 0x36c7bb4d7c082eULL, 0xaf4fec4b6865fb81ULL, 0xa43d3d055a8f3334ULL,
+ 0x706796aeb838f66fULL, 0xa7d4a1284a431bc9ULL, 0xf4a699c62f716f7cULL, 0x16e759681d6e65e7ULL,
+ 0x95ee836c87918adeULL, 0x4ca10d3af360924aULL, 0xc83d271ef81e0543ULL, 0x696beeee71837cb1ULL,
+ 0x7d1a6de36039a17eULL, 0xb725333febc7a2e3ULL, 0xae882bcbc304fc01ULL, 0x668250d32afee5c2ULL,
+ 0xf2333250996b260fULL, 0xa2495ea1cebe700aULL, 0xd1fc886eb8ca6b55ULL, 0xbd0f5945b725cc4dULL,
+ 0x7e68715e6361b0e8ULL, 0xfb608259c4ad881dULL, 0x747c9ac572218777ULL, 0xf4e63189644154a3ULL,
+ 0x823d6fc6678b3a76ULL, 0xb44aaf3751884089ULL, 0x440a585a68277d59ULL, 0x79b998d7e3ba604fULL,
+ 0xe7861b9a14bd3368ULL, 0x389c11cb97295379ULL, 0xffddb286a063ff84ULL, 0xdf2678c02443afa6ULL,
+ 0x79a3846462cde45bULL, 0x3dcb11e80190e265ULL, 0x8906e94e3584f403ULL, 0x4fa4742c557a4c83ULL,
+ 0x15ce538a0de5abf7ULL, 0x39e4b5e68e7a249cULL, 0xe4e581316972b798ULL, 0xb8bad384b608af45ULL,
+ 0xb035ccfc606e8c79ULL, 0x660eaec718d0755aULL, 0xd91757afc8a7572eULL, 0xf76b161936ca27d6ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x984b71e965b81454ULL, 0x4aa2b12afe9c944bULL, 0x923ff59213a7e526ULL, 0x5868980ebdd6541aULL,
+ 0xea0bd455d64bbc26ULL, 0x512ef2d2df1a1d5fULL, 0xed589cb06d80caadULL, 0x8e04cba52a5e1741ULL,
+ 0x30065b7a3cd07c04ULL, 0xcac5d8b53e4c7fdeULL, 0xe213d821d1eb3f0cULL, 0xaba9ac74746d555ULL,
+ 0x1fd06eae4d5f1a99ULL, 0xf8bf8d65a0c7e17aULL, 0xc5cad66fcacb9489ULL, 0x7cfc07bd31846ccfULL,
+ 0x6480ee9dcd59c9adULL, 0xabf2310241e45410ULL, 0x956a70870ab08872ULL, 0x9d39f4ce7c17b3edULL,
+ 0x38554651152e2e78ULL, 0x1a46ba498427b590ULL, 0xb17e03b2d7380cedULL, 0xb645f815ed02b3f2ULL,
+ 0xfaecee2644a08f8bULL, 0x929d98507e781f83ULL, 0xf085bb4803561e9aULL, 0x97810a87e2fa2609ULL,
+ 0x9fc4645da75a45aULL, 0x1af4b481a3a4ff4eULL, 0x9bd550640d4685d0ULL, 0xff4395e407629fb8ULL,
+ 0x5a53054426e27f90ULL, 0x476f5803f5e0d0cbULL, 0x33a185e6b276caa8ULL, 0xe37aa83985a9e4bdULL,
+ 0xe1840c8d9d2b8a43ULL, 0xa7c0570264775c18ULL, 0xdab4e422588a3ad0ULL, 0x3432b5d3fd81d9b9ULL,
+ 0x4956e7f2ccbf6f50ULL, 0x42bbf514ea7c8c7fULL, 0xec1383f0b6213df5ULL, 0x9a1f8674162dc239ULL,
+ 0x318d60d0f221e2c9ULL, 0xe1366cafd2103aa1ULL, 0xb25bd04d5087d1ccULL, 0xe5f82334f50a805dULL,
+ 0x3b283f30c35d5becULL, 0x77c2c017b546ceeULL, 0x4b7869bbd3e9f290ULL, 0x94d4815155ca3c0eULL,
+ 0x2e9df9a948fe695eULL, 0x6d403e8d01bb4607ULL, 0xd90e419dd2a3af7aULL, 0x4bf0d936d070a0f7ULL,
+ 0x47c1011651125ce5ULL, 0xb533e39a44247201ULL, 0x3617e73b8a8d533aULL, 0x44ccc48db07cc26dULL,
+ 0x283da6bb80369fc8ULL, 0x49cbc8eae8c5e904ULL, 0x8a8085d301a027dfULL, 0x4128cd8ce00b7614ULL,
+ 0xa1bdb9b2e3a7d512ULL, 0x7806060672e5832bULL, 0xc7a9cf424b6a3918ULL, 0x6fb762439d3be92eULL,
+ 0x6b9180abb0f6012eULL, 0x9ea7c07c47478f0cULL, 0x9f4fed0721aa54caULL, 0x3ea2fea7750ba0d7ULL,
+ 0x87656b1d276af083ULL, 0xdfbd4d881f32c02fULL, 0x8d1917d45029c1b6ULL, 0x4cb05ec39e000b63ULL,
+ 0xdf8702e1389de1fbULL, 0xe3418960f3ed6899ULL, 0x7ab00bfb55cf778bULL, 0xeef967ea97b951ULL,
+ 0xeb138bcd16d87b75ULL, 0xdcdb296e4669c989ULL, 0xa7b1bc704014ec35ULL, 0xe6427316e135fb46ULL,
+ 0xcfb152e486ab5664ULL, 0x51fc1bca16ffa417ULL, 0xac6574beec560181ULL, 0x1f0152eab7bbb763ULL,
+ 0x6df5e2205b62f251ULL, 0x1de86f7206c7de46ULL, 0x484fb49d0a5a7b0dULL, 0x62c16124d5c7e090ULL,
+ 0xbe9b9f9886578271ULL, 0xc1431c1bf7653ffcULL, 0xf2a95f602d44bb56ULL, 0x36ab6fca541588aeULL,
+ 0x5c3442ea1a7e0974ULL, 0xa89552bbf7bc81d2ULL, 0x3bd482ba69c9ee04ULL, 0x74cf2b8184afcfcaULL,
+ 0xe8ccf7070b0d426aULL, 0x770705d6a10a9589ULL, 0x157e9160d4d38532ULL, 0xca1721fc2b99daa3ULL,
+ 0x943fe382ef8836fcULL, 0x30d9f49f1b49a79cULL, 0xc2eb175fc4199a14ULL, 0xb8ad192481ccecbaULL,
+ 0x22c9c9609a61722aULL, 0x3e58309f728c3e46ULL, 0x57dce94b4ef4be5aULL, 0xda9fcca869107d1ULL,
+ 0x578b0640475702f9ULL, 0x33e1abdda5a6098eULL, 0xe34b0fd36b8b75c1ULL, 0xe172a16e562a81b1ULL,
+ 0x8b8bf462d8fe0465ULL, 0x812b8e8f5a63cd9cULL, 0xffa01a59b0a18fb0ULL, 0x5aaf11f4c2cb21bULL,
+ 0x3c7942e6d8d23658ULL, 0xa772fa1cb77b4cefULL, 0x6e82935db226b9c0ULL, 0xdfdc7920771ba235ULL,
+ 0x8ca54de4cd3311acULL, 0x3ae2c6659ae453ffULL, 0x438d652e5fde9a5cULL, 0xcb25b64b7a7ca9dbULL,
+ 0xad49387f4962bf6bULL, 0xd6b8b6198d2a07f1ULL, 0x6d1389f47a7269f8ULL, 0x197f21a17f7ccb88ULL,
+ 0x6e7947f9171ef4f0ULL, 0x633bd1a9377bd1b7ULL, 0x2e91ac9347041a33ULL, 0x83afd08dd97143f9ULL,
+ 0x6b05308c27ebe6d9ULL, 0x85c25351d502e7efULL, 0xd5e962ebf532b329ULL, 0xa0dad6b2aa057771ULL,
+ 0x338479768ce08e63ULL, 0xc8144c776f84440cULL, 0x361a29d8e99ebeceULL, 0x58bb4d2b5acd575bULL,
+ 0xc43df7164ff3d7a6ULL, 0xd8ca6f5151d5815cULL, 0xd385b950deaf98c4ULL, 0x341d446fd42291f3ULL,
+ 0x88c5a93644650a72ULL, 0xebce81e4484b640cULL, 0xa8ac5ec07d93c8a2ULL, 0x1d7f772952124fa5ULL,
+ 0xe9dc15ca602208deULL, 0xf265c78bc2b2f4faULL, 0x542929fc97af65dbULL, 0xe6e26c4f31d8d791ULL,
+ 0x3d1091185671bddeULL, 0x12313882b8c1494ULL, 0xab2667e64d731139ULL, 0x5eab1f6140bf6933ULL,
+ 0x85fccbf6eda36773ULL, 0xb9769dcc62a502d2ULL, 0xe03d20e1a5c1fbbcULL, 0x2e1ba7fb60b60913ULL,
+ 0x8927f7b904b87428ULL, 0x5781d51f84ccd20bULL, 0x65c5b6b92d426de4ULL, 0xa913c8330d32618cULL,
+ 0xa396eed420458acaULL, 0xb1403c7749537638ULL, 0x26fa0021b23fb169ULL, 0xd71ba27f52e5db94ULL,
+ 0xa4615fe710b5c8f7ULL, 0x3c1e8593af5ae816ULL, 0x9719936bf6b76c95ULL, 0x11a4f846c265f692ULL,
+ 0x5f44d5b858beae80ULL, 0x1882507b7b336890ULL, 0x773b9bbf60c42a50ULL, 0x24784a0a037bd6dULL,
+ 0xfcb628b8d6cde7f3ULL, 0xc5a4d309817d6801ULL, 0xc69228e9469040f9ULL, 0x14d39b00844ecbc3ULL,
+ 0xfa4a3b186979a440ULL, 0xaa6d6d3de76c5ef7ULL, 0x70bc14533627e880ULL, 0xa78835f6bc42e2dULL,
+ 0xa16a31a03fe82360ULL, 0xbdb7fec5816bc37cULL, 0xa1c6ba23733bb9d8ULL, 0xfb6ac5b304f0a5f2ULL,
+ 0x50a60695252b45a7ULL, 0x700586f249adbf97ULL, 0x3487224fc32896a2ULL, 0x39b6d8e3896a0b22ULL,
+ 0x335f4a81aaedce48ULL, 0x35c8a12b5d830fa9ULL, 0x49cf390cd462fd1ULL, 0x627209481eb15885ULL,
+ 0xe96236ceb3475e7fULL, 0x140db193f7329201ULL, 0x58262e39d021e8beULL, 0x6e8d7a2904104bf1ULL,
+ 0x4498192b3b1b01a6ULL, 0x5d459ea9af54c4cbULL, 0xc59558747d3f72fbULL, 0x94c2362a588334cdULL,
+ 0x1e57aa7263812c9cULL, 0x258cd807d16ae4afULL, 0xbf613e8fbecdaacfULL, 0x9ebf099a46be7619ULL,
+ 0xb1d294ac64bed35bULL, 0x4c9e7ce78701104cULL, 0xdce672f857cc0c27ULL, 0x5d2682de3bac7e6eULL,
+ 0xe95b4f40bc21b28dULL, 0x829e37e95b76688fULL, 0xb8c9aa9c2ab69c4dULL, 0x2201872128e702ebULL,
+ 0x70e94d82ed3ae109ULL, 0xd687c2c025dfd4aULL, 0x7157fe02114818feULL, 0xd131839c4981f9daULL,
+ 0xfc4d6b2e360926e5ULL, 0xf0dd3443278175deULL, 0x5d6fedfae9de0125ULL, 0xcbf561b8b7078e46ULL,
+ 0x35392b5d076698feULL, 0x123c8a9c2689d64dULL, 0xc7f3069932e8c43cULL, 0x7bf9850a4275d71eULL,
+ 0xbb92e68755968ebfULL, 0xb914f18dfff9ec1cULL, 0xc8dc753b62226301ULL, 0x7e3dfe582c8315b4ULL,
+ 0xef52b53a29182dc3ULL, 0x218492a7721904d6ULL, 0x48be64e729d23c06ULL, 0xc30494099e1f2f77ULL,
+ 0x27d7b1dd5d2e9ec7ULL, 0xec314a9e5032bd20ULL, 0x6b5b9dc20291bf41ULL, 0xb7fd448bae00d57aULL,
+ 0x2c25de5a87469529ULL, 0x3e892d83c5bac3deULL, 0x7dde4fecc09daa62ULL, 0xb79f5190f2259058ULL,
+ 0x93d0cd32c6cb01ebULL, 0x28d2929969fea68ULL, 0x4401701454c181fbULL, 0x7954588407f955e4ULL,
+ 0xe67364446a0614f4ULL, 0xd99b6a4b318c4acdULL, 0xf02e222ed5055a76ULL, 0x47f192c7ea2dc9c8ULL,
+ 0xdc829a2f0a3d81ffULL, 0x3e82075085c9e98eULL, 0xd60e55181759ced1ULL, 0xa1ee8a71bdfb608eULL,
+ 0x87ab84a365ddb0a2ULL, 0x52cffdfa401e4a34ULL, 0xbf5f54f2ecbb9337ULL, 0x1eb8377027b105caULL,
+ 0x2bdae39eefec2aULL, 0x60ca539e3eee4045ULL, 0x942afe42163accc5ULL, 0x5b96feabf704a1e9ULL,
+ 0xa42a1510555c0b5ULL, 0xaa84178803f1d3b5ULL, 0xaf1e89a4dd34986cULL, 0xd352ca2b69c2b9d4ULL,
+ 0xd3517a52fe03a649ULL, 0xd73e6f7cf774d911ULL, 0x7aec989a41527c07ULL, 0xb813f998390ad0d2ULL,
+ 0x3895037f5c482f31ULL, 0x910519d92856377dULL, 0x24a6b6e5bf37984eULL, 0x5f3101a8d3d37fa2ULL,
+ 0x998a9abdb8d9c3bULL, 0x99b0a0ce166fb063ULL, 0x69c3493eb1ba2394ULL, 0xe69942a210421018ULL,
+ 0x7073a3e0dcf1e832ULL, 0x99201f3b69ca405fULL, 0x273609a46b61789ULL, 0xee823f39ae06b308ULL,
+ 0xfe492786b951e051ULL, 0xa96908988025ef18ULL, 0xf9ac97fe9ec3ecb7ULL, 0xd325a47dead20adeULL,
+ 0xa1e92582a257d38fULL, 0x1df77586603f3da6ULL, 0x75e03e5c40aab419ULL, 0x77b7c5d77a956c60ULL,
+ 0x71ae1e98aecb4eeeULL, 0xf3a49e6c097554a3ULL, 0x1b44f38bdddecd9dULL, 0x3a1864fe308acb50ULL,
+ 0x6d526c8426a12c52ULL, 0x3880f05bd3d180d9ULL, 0xe12bdf709410929fULL, 0x6208fdee15004c63ULL,
+ 0xf542c110359f9d80ULL, 0xaca0a63a46cae834ULL, 0x9e625e67280f9533ULL, 0x180d40ef5c0409c2ULL,
+ 0x90fe7c5170c3c618ULL, 0x961bb72a407ed342ULL, 0x95505588c8c472c3ULL, 0x3b62bf5c51c13929ULL,
+ 0xdcf67aedebe1b4d4ULL, 0x3345d9e2422a1cb9ULL, 0x27311dfed1c94ae4ULL, 0x875e4e270966bb2ULL,
+ 0x59aa953d148ca994ULL, 0x3d119b3051536722ULL, 0x5921a0d2ff703312ULL, 0x9c501f797ed091eaULL,
+ 0x98102dfd22842262ULL, 0xb06b5f240bf9f9d1ULL, 0x6629774aa8b538bfULL, 0x67422ede2d1f6c01ULL,
+ 0x5faee84b64f613ebULL, 0x7a8a42529ccbcc36ULL, 0x2535294238907c36ULL, 0x7510f15ef379ad7eULL,
+ 0x956142f0ee4ec7ccULL, 0x772f56f71cdbce71ULL, 0xccdfb7464fd6f35cULL, 0x9efb914870413052ULL,
+ 0xd406ac3489c9fdfcULL, 0x1f42a0f8930a6c87ULL, 0xb536be419f4ce4b6ULL, 0x921b7fd89685e85bULL,
+ 0xd2003d58d47bf8acULL, 0xe0ab92ad3988b44ULL, 0x83da2f009de8f51dULL, 0xcb208e52e6e3c372ULL,
+ 0xcb485297ee8b3decULL, 0x31d6793722c1ce3cULL, 0x7843e6c028ac3a54ULL, 0xbaaacc80781ece3aULL,
+ 0x8b8e4f3e3485c856ULL, 0xa91ab067494a1eULL, 0xcb15f141abf632d2ULL, 0x6215c7648e3a7761ULL,
+ 0x2a90be0f54741dcdULL, 0xe81faa5b76ba1d82ULL, 0x83bd047201a1a50eULL, 0xc38754e542688e2cULL,
+ 0x730bda63139263a8ULL, 0xa11bc291bd1eee0eULL, 0x785da2dbe7574b7dULL, 0x1788f9773c22543fULL,
+ 0x6dc38559568834d0ULL, 0x2d38ebc3d018654fULL, 0xb0e54cfc4f615207ULL, 0x3b79b7d75ab71280ULL,
+ 0xbbb949da2d21fb40ULL, 0xfb5af17949f5d162ULL, 0x3d3d480b91b6d4ffULL, 0x7cc2da6424ae172dULL,
+ 0x898361fada0c5c00ULL, 0xfcd39a751b327a49ULL, 0xe59640340d1eadd2ULL, 0xa2aa1c6562109d60ULL,
+ 0x4bb30b218d87c8f4ULL, 0x4226843f9bce08b7ULL, 0xf13f2c85b216c1d7ULL, 0xc432f3b034dfa5d0ULL,
+ 0x982f098d12a2844cULL, 0xfd16b65c03e32bbaULL, 0xbe235fc7710741c3ULL, 0xb90283f59f4b90fULL,
+ 0xb9b009098b370473ULL, 0xcdf458800b440222ULL, 0x48fcd26784823911ULL, 0x1e65db58ff5d26d1ULL,
+ 0x42d6a2f7df049188ULL, 0x6290ff5934e4cd59ULL, 0x45c81528bcd405d9ULL, 0xfafc04844e05a2baULL,
+ 0xb048dc64482a58faULL, 0xa22829273c8ef04cULL, 0x86e27d8682788ed1ULL, 0x2b33981977d374cdULL,
+ 0xbfdcc6149ff8e59aULL, 0xc939f12fffde985cULL, 0x5f44f8938cbc1084ULL, 0x79a52e63014f5efcULL,
+ 0x5f1c78f64931e60aULL, 0xd9e8dbd6bbd5bab8ULL, 0x542bae744e25978aULL, 0x289d5ef9f2b03b0aULL,
+ 0x237870a3df282d9dULL, 0x9d884d785417951bULL, 0xbf7c109f91494443ULL, 0xfb311e2a8fd2e241ULL,
+ 0x6123a5bcfeafa1cdULL, 0x179df607a9494e00ULL, 0x3e0f4c84bd24ebddULL, 0xee911e6b435c6b43ULL,
+ 0x951b63fb3a157c25ULL, 0xcc931defb00790d7ULL, 0x7fa115dc6bbf9b46ULL, 0x8b18ba445dedbb6fULL,
+ 0x1cb6c8a2a7e614a6ULL, 0x2b4b3f9510e32c04ULL, 0x8af2af5630eaaa8cULL, 0x33ec9711f8cee17ULL,
+ 0xbd48833d628c84d6ULL, 0x33164d0a66198bbeULL, 0x9c3f7c6b37fedaf5ULL, 0xacfefff50cbc3da2ULL,
+ 0x9991341771292b6ULL, 0xbf6eff1d5d6ff030ULL, 0xb6943e11744e56edULL, 0xec8684edc5df0c9aULL,
+ 0xb63676347059455eULL, 0x36292245a43b667aULL, 0xcac3d08ac03990b9ULL, 0x3cc088aebcd1caa8ULL,
+ 0x8b340d06b85da2b6ULL, 0x6a0a45e1fbe3ede5ULL, 0x776042546345a7a0ULL, 0x3ead9cf77e25e1c5ULL,
+ 0x18c7e17751788049ULL, 0xad29b7b1d5d1079fULL, 0x39ac1e492af18da1ULL, 0xf2be82737ff7dc80ULL,
+ 0x85d0855b115e74d8ULL, 0xaaf005b7bbe99701ULL, 0x6f36371761783238ULL, 0x7510cddbf4418681ULL,
+ 0xddd3d08fa69457bdULL, 0x45e71a52691b8063ULL, 0xa17c3b3e9f18809ULL, 0x5314846de679431ULL,
+ 0x33ac92e5f343d782ULL, 0xe7d2da12f4509ee8ULL, 0x3f574c7a368b114bULL, 0xd6d819d3a624566ULL,
+ 0xb523ddeec7f4a96cULL, 0x47c3791058ed0e16ULL, 0x448ae36c93ae8a4ULL, 0x7feeeb29b4375e6fULL,
+ 0x864591c7b0e21e73ULL, 0x8c062f29df7a6a77ULL, 0xa5583a566afd0ff4ULL, 0xc5e655529d6d19a7ULL,
+ 0xa82ec65c3a38e263ULL, 0xe8bd8838f4d10c52ULL, 0x34c9eac7e462f751ULL, 0xf2afbe3357c49d13ULL,
+ 0xce12313bab5382c6ULL, 0x86cc86a19e21e275ULL, 0x744b0d20231b1208ULL, 0x5eaa0fa5f448f722ULL,
+ 0xe49e0b1888176363ULL, 0xf224ca72f1bd2e65ULL, 0xf4c7b4c2fa06a807ULL, 0xf1c643c2ee3f46caULL,
+ 0x5869ee593c582a83ULL, 0x2ed4f6f38145ee7fULL, 0x62ea309f41dd8e4fULL, 0x6cdaae7ffa59d108ULL,
+ 0xb4047e21c027e36bULL, 0x2e6bfcd530d60439ULL, 0x4a31ff3c435d04c2ULL, 0xf28741d120442679ULL,
+ 0xd2af2dea4408ddcaULL, 0xb0aa029583a6eae8ULL, 0xa4cc9f40dfdfe874ULL, 0x1fdb3cbd49008128ULL,
+ 0xd323bf94f2c4d177ULL, 0x82c7a6ee1f01a1ffULL, 0x9fb6375c7b39cb6dULL, 0xa24168c56f4fa9eULL,
+ 0xa4778b364a7f8f56ULL, 0x12708b47af3040cdULL, 0x5ab7a26cac7e52a2ULL, 0x9ec96bc8a9baa456ULL,
+ 0x79ca9e917745265cULL, 0xa65a12c4a9fd05bdULL, 0x6976e0ef56ba177aULL, 0x61fd9d74c28813dfULL,
+ 0x10fe183e0f4e5419ULL, 0x5da5f5d90f761dcULL, 0x9cc3ceff6a637cdeULL, 0x5516cf21193958f0ULL,
+ 0xad733b75167ba0f0ULL, 0x3780cffffcf96d1bULL, 0xc04df343249cfc14ULL, 0x1609fa2227eca724ULL,
+ 0xf4058c1bc6b00ddaULL, 0xd1fd70978da6c3eaULL, 0x81569a5f26c95be4ULL, 0x259bb5c5d3e3eae9ULL,
+ 0x88dfd0f782f76b70ULL, 0x25e9a0f8538babc6ULL, 0x931fb7f4c5750adaULL, 0x4752685cbd93deULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x1d62debe36fde350ULL, 0x5073f2cd475a89d3ULL, 0x4efecd67ff5a51eULL, 0x2e0906566b04e96aULL,
+ 0xebf7691c15a93a95ULL, 0x3f509d467986c246ULL, 0xa06adef26a452af2ULL, 0x39e72fee8ea771c6ULL,
+ 0x4938b1dcef5a059ULL, 0x77979b83c2e8410fULL, 0x47834657297cedb4ULL, 0x807c48cda0245161ULL,
+ 0x22ad46747478859bULL, 0x736e4fbf6eb83ebULL, 0x9e519a3d47e10b8bULL, 0xaf3b04aafb33c1a8ULL,
+ 0xada2695dc366bba4ULL, 0x64a85fd0b9f8cbf2ULL, 0xb373b06bde9a5c6ULL, 0x83dac07691fbda1ULL,
+ 0x195af8101c24f6cbULL, 0x3a91ceffc7bc5b1bULL, 0x12d2ec3ce06c1163ULL, 0x37b2f666de7a782dULL,
+ 0x870e8d95edb78c96ULL, 0xfc86a84dfc0041fcULL, 0xa510ce6f943376aULL, 0xd6e7029469b08fc2ULL,
+ 0xf683d07e36385c4aULL, 0x5e3e25a9107c6fcaULL, 0x9a8180199b40f07dULL, 0x763acbde017eef59ULL,
+ 0xbc6ae22599b8fba7ULL, 0xc44023f11477f8d9ULL, 0x72819508b5ab4f9dULL, 0x21347b606e0274cULL,
+ 0x6b12529e610816a7ULL, 0x938586e5044e5e9ULL, 0x823066176984c697ULL, 0xa7f517d4efd46b5eULL,
+ 0x9d3cc3520f01972cULL, 0xd79e1981f9da0730ULL, 0xfa6b5602b31939c1ULL, 0x14ba769e29e52ff0ULL,
+ 0xb562b42def2200f6ULL, 0xa252aff00f29cdedULL, 0x38228011a4c6b26cULL, 0x478c154b633d3b0dULL,
+ 0xf2f7b3675e80be63ULL, 0x73a28e864ba3c31aULL, 0x32351d82afe86dbeULL, 0x1ae205a3e911077eULL,
+ 0x93c6c2dd541bdcdfULL, 0x2cdd906604c110d4ULL, 0x50e5b5057bb54f1eULL, 0x244c5827b6e9a412ULL,
+ 0x3dd8af3149eab95aULL, 0x7122eac6d2940385ULL, 0x9f98509ea7844d63ULL, 0xf62af1c08c51ddfULL,
+ 0xfd445e06a6256c49ULL, 0xf36993bcd6bd49b8ULL, 0xbe6e780de4b6cec4ULL, 0x4e9f358f9c754871ULL,
+ 0x65fdbda98414c34fULL, 0x72c8d4555f3e8df1ULL, 0x5f571cd1697186ddULL, 0xf3c96ac143b8391bULL,
+ 0x2cf522d02c1ea0e3ULL, 0x5eaa94e3804f8b32ULL, 0x42e9f97e85c6946aULL, 0x67b3fb75593db999ULL,
+ 0xe5d2095e4e96a978ULL, 0xfc509c0a64031240ULL, 0x377b3714412570afULL, 0x45c53acd0699b220ULL,
+ 0x330e249fa3fac915ULL, 0x4ccbd5ae91ad0883ULL, 0xd25cc374202374c0ULL, 0x138b085f3c57934dULL,
+ 0x97d62a8cfe08fd08ULL, 0x9fd665ed3de9b37ULL, 0xe1cec330c24cdf5aULL, 0x61a4248bffd695d8ULL,
+ 0xdf37ff52b76d143aULL, 0xdc58d12eb162df45ULL, 0xebf85d44548ddc21ULL, 0x23dd7acb4f56aeULL,
+ 0xd46f595f242b0f1fULL, 0xbd486922b1b03c46ULL, 0x728d6ff76e017502ULL, 0x3bbc3b4467ba71ceULL,
+ 0xce85ab3c8fabaebcULL, 0x18076e33b21efee0ULL, 0x5c395d8c4b53b1dfULL, 0x269657e67ff81c6fULL,
+ 0x9e70a32396b34b4cULL, 0xeff366ed088a12c0ULL, 0xa8fc80a12ef45043ULL, 0x72858f34eddafdf6ULL,
+ 0x62480aff6eaa3547ULL, 0xc02f161c959b6476ULL, 0xfd354bbad6c25236ULL, 0x9b368eb1ae4b6456ULL,
+ 0x8e2f8708e4cd0608ULL, 0x14cc0358b7ce1ae8ULL, 0x6dcdf4e1aa21b493ULL, 0xdaf232ff9b0a33baULL,
+ 0x1157aa4cf7a378f6ULL, 0x57a9c2bdf54674e5ULL, 0x6e1f89f920f6bd0aULL, 0xd29e7ac4bfef6543ULL,
+ 0x8f83faab255b06acULL, 0x96e24d28fdee85b4ULL, 0x78c7342e93367967ULL, 0x9d8bd952d48ac8b7ULL,
+ 0x9fa844ebc1a6fa5ULL, 0xe780d2286e79902bULL, 0x9a60b2f1019ad932ULL, 0x71cc0487bda1f2cULL,
+ 0x888e3b99da794442ULL, 0x2804fa115563d722ULL, 0xd619d8104b7697a7ULL, 0x98322739de3a7b41ULL,
+ 0x166941ae0663659ULL, 0xc93ed6ccde26bab0ULL, 0x39c7a8dfd6536521ULL, 0x300793d044ecb164ULL,
+ 0x1c966583e53a3fdeULL, 0x32003f68308f46e5ULL, 0xf36a79df57f035dbULL, 0xc957fe47c65a4d10ULL,
+ 0xd879d46c274e3585ULL, 0xe9e86f32842e76acULL, 0xcec518d7648e6bc2ULL, 0x41356f7f69b1968ULL,
+ 0xee2b81c300cdb544ULL, 0xc6935abbd3f0c8ccULL, 0xc65e1f7034fc0205ULL, 0xd836e975ea5dd9efULL,
+ 0xef8824a720ab1f08ULL, 0xfbec080d6fd3470dULL, 0x1378dcd71909ad42ULL, 0x35f469ccf64ace72ULL,
+ 0x8abf7bce352ec5c1ULL, 0xb0aec3ebb7397a1fULL, 0xcf362043eaacc683ULL, 0x5e2bfeba0e678c14ULL,
+ 0x70e4572ede8f3c68ULL, 0xa5cad44cf2d20282ULL, 0xe215759e250dc3baULL, 0x89dd7c43ec69ccf0ULL,
+ 0x10d0c73ad2953b6aULL, 0x6c582d483b2ad66aULL, 0x9db16c9738e050f9ULL, 0x2ef9dbf7d23d26c8ULL,
+ 0xde38ccae5a611836ULL, 0x30e845264eb26b73ULL, 0x769cd30eeae09554ULL, 0x242f6dc4c38aeb29ULL,
+ 0x25e8ae7adfd18624ULL, 0xa2b88c9a6ab50a96ULL, 0x37e19f609f6c19b8ULL, 0x80b50ec92828d0baULL,
+ 0xf3f808098a021cd3ULL, 0x33dec823f4887674ULL, 0xd399931c1b3157b0ULL, 0x19c81ede25270702ULL,
+ 0x43654f0af386597aULL, 0xf43f62111478886bULL, 0x626327b09439a80ULL, 0x7dd96e9699ebbb1eULL,
+ 0x392053f26938e247ULL, 0x709e2330fd7a0e6dULL, 0xec8badca0255e89aULL, 0x2fb8df74af92fe3fULL,
+ 0xc55304950e8ab821ULL, 0x47f07d94cce6fb00ULL, 0x5445d467c5eeb7e2ULL, 0x866759ed5a813fe1ULL,
+ 0x4816c63da2034740ULL, 0x4d379f8e0f3e7c1aULL, 0x59e2d6ae7768af27ULL, 0x22160888a5c3bfbcULL,
+ 0xf9346ac648bcf8b9ULL, 0x960c1ca1e161e554ULL, 0x961edb72a76a7697ULL, 0x2933021222cd658bULL,
+ 0xa3d77a20520d676ULL, 0x849303b7847d9e8ULL, 0x23a3e77a429b33a3ULL, 0x252a72cfbaa27ca1ULL,
+ 0x6b972c869036fc2cULL, 0x586c299c1c9d0c5dULL, 0xe9be67b2cb1f251eULL, 0x478a451e7dddecb1ULL,
+ 0xdd18640655a35629ULL, 0xa53023b40b7c8f90ULL, 0xf4b6538ec570afe6ULL, 0xc7b6fdb5a87a67e5ULL,
+ 0xc47a58491249ce15ULL, 0x5d2ab9ce4cf6ed34ULL, 0x94171af2257bec4bULL, 0x15e846c0d936a0c5ULL,
+ 0xb230f9e16334d775ULL, 0x81500d4aa70c20e8ULL, 0x922bddb197c9875eULL, 0x3f6310fd108af1c6ULL,
+ 0xb327746333df40c1ULL, 0x45564efa6ef1e9b3ULL, 0x39e650ae9f87fc4eULL, 0xf788265ee8f150e4ULL,
+ 0x5db325ddd992a5f3ULL, 0x7115d3fa0a9639a0ULL, 0x62632dcbd39ff2ffULL, 0x374ef21208b5a3cbULL,
+ 0x5c64d6f12e6c5f02ULL, 0xbd47da3e368843d9ULL, 0xfaf66dd64b89e34aULL, 0x7ce49e06c70ca18cULL,
+ 0x840fd321ffef7751ULL, 0x41c36ec995708df1ULL, 0xbd4aa48b3da83b4cULL, 0x6e3c7986e9fa1b6bULL,
+ 0x16b5d109d7c35ce5ULL, 0xce4357507868f750ULL, 0xa983d5fc76f36159ULL, 0x3549d9dc3bac9dULL,
+ 0xa6c409e57bf70a6cULL, 0x27f52275a087eceaULL, 0x62b5ae69c14adaedULL, 0x969e453587750605ULL,
+ 0x5a389f44b2c2ee7cULL, 0xdc4e50c8570b5aecULL, 0x27ecc914ed02b73bULL, 0xe148aa0060e5f1d6ULL,
+ 0xf02c7d0233379b1cULL, 0x6ef28ae57a325087ULL, 0x51f0b2001146041bULL, 0xff699f4c654d76cfULL,
+ 0xa4e111576cb6b7bfULL, 0x9c637c95330b19ffULL, 0x9e526eb18b2fe981ULL, 0x5eeba7415c1cad7fULL,
+ 0xb654318d9d796c50ULL, 0x1cffd4df57fab2beULL, 0xda579b66c98901ffULL, 0xaea7033feb582430ULL,
+ 0xa08399c7611d1f72ULL, 0x31e010b2979fd594ULL, 0x4b3437fee19647b3ULL, 0xee62d0d9da1f257eULL,
+ 0x71c116ad223dc7dbULL, 0xfc20a0ae48cbd6f6ULL, 0xb1d46ac4e8845936ULL, 0x2b1ecf8baaec16fcULL,
+ 0x41bec6328bee85a1ULL, 0x6dc89fc2262288ffULL, 0x942ffc70fbaa5ea7ULL, 0xb9f1e6e274d5e353ULL,
+ 0x7f0f6ce319b777c7ULL, 0xfe1327fec13e6e22ULL, 0x6c8165c2f3f6b277ULL, 0x81dc29f2f14bb23fULL,
+ 0x62ee90a237ee5d49ULL, 0x3b095fa7f1839a11ULL, 0x58b944e3fa2789ffULL, 0x4cf33b9cde4e4886ULL,
+ 0xc04592538dddfb64ULL, 0xbd8b6021e62fec96ULL, 0x3ea4b01b75110565ULL, 0xc4828711f9361c38ULL,
+ 0x95b35c579fec5f2dULL, 0x9a66af3780c44b49ULL, 0x711f710748ecddbeULL, 0x83cbfb4938fd6f68ULL,
+ 0x88b9764971316188ULL, 0xba484f38a4368ee4ULL, 0xe7b560a2fdb676a0ULL, 0x5f52f6c5229c6385ULL,
+ 0xca54684ceee8e9d6ULL, 0x2bc2b289d8336c67ULL, 0x7be4a3e39550ededULL, 0xe98db45290de4d15ULL,
+ 0xb53e05065aa1cf50ULL, 0xca030f74bbb9ee5fULL, 0x115ed569e8268b7bULL, 0xafb0d229fd51da5cULL,
+ 0x77fc29a5763152baULL, 0x757e502c9d617964ULL, 0x6ea07e3422f1c0bbULL, 0x2aa5d812eddb0233ULL,
+ 0x887880fd677ebe30ULL, 0x37442592a7913100ULL, 0x1b9bfa3c9bba27c9ULL, 0xd0f4ab7cc9ed7787ULL,
+ 0x23a467f68b441ad8ULL, 0xd45859e8c28d4493ULL, 0x69398f05506bea86ULL, 0xee4e794dedf58b4dULL,
+ 0xdf5a17bc66dc9f6aULL, 0x407e176f34d5d7fbULL, 0xf30f96a7934319a0ULL, 0x9866cf03a4423286ULL,
+ 0x6b088722df46105fULL, 0xb76c6cd25c46e623ULL, 0x4d82d6712921adc1ULL, 0xa707c8c38b3ead52ULL,
+ 0x1fc32e6a2dbbd1cdULL, 0xe1c01b595d46614dULL, 0xbd84596b8340ee6bULL, 0xab6063d49412be49ULL,
+ 0xbae67d7816f0fd37ULL, 0x3ebc5e86f3cdfd6bULL, 0x6cd3fecfded3027cULL, 0x5283a5c5c2bc659aULL,
+ 0x4457b186787ffc23ULL, 0x96df4f84c7d97257ULL, 0x642b23efa7abc3b6ULL, 0x449c48bc5eb99ebULL,
+ 0x1145e5f6f23cf7f0ULL, 0x8342862f6d938e5bULL, 0x1b9911627a6731eULL, 0x3c29b8eb85996ea4ULL,
+ 0xed8528e5bf5a3e54ULL, 0x243d5d34630f2cd3ULL, 0xb011832d8efa764dULL, 0xb74401c15cd04a4dULL,
+ 0xbf6915057aeee47ULL, 0x671bae143ef345f8ULL, 0x3d27fe8468696726ULL, 0x66085772f1fff006ULL,
+ 0xeddc134f70b011f4ULL, 0x2becbe4fd9e565c0ULL, 0xaede1399d3585d7cULL, 0x348c79970a89ed49ULL,
+ 0xf21e49a8cd93a81aULL, 0xc35cdf149210fd20ULL, 0x350f4abc8a2db79fULL, 0x20c895a318ab1cbaULL,
+ 0x8e45fa2c98cdfad3ULL, 0x9e5795d2f66d6eb2ULL, 0x72537a60e71421a6ULL, 0x74d21c782b1486c7ULL,
+ 0x7ef6b6477e641999ULL, 0x78112bc26d6a6b1cULL, 0x96f7645e2895770fULL, 0xbbfca74b4e0c8628ULL,
+ 0xc7238a36d1dc8e2eULL, 0xba77937c5d4259a2ULL, 0xcccde4e6cc4d63f4ULL, 0x27d28160aa95d43ULL,
+ 0x52de3061e58f2d07ULL, 0xe799ca9bff4de8c1ULL, 0xf26e10bb49391648ULL, 0xd729d5c52f6cdb86ULL,
+ 0x7606f4e892b558d5ULL, 0x9871c5ecb38c0a9cULL, 0xd9259d64d120d16bULL, 0x2f6a5b9d651f2e90ULL,
+ 0x31186ae35805ebe6ULL, 0x9c01f78fbf71ebaeULL, 0x5ce95e72b6a0ec23ULL, 0x170a7c6853b49be8ULL,
+ 0x6aee582cf3730b74ULL, 0x3eb9b89de32f1b6aULL, 0xbbb1130be77140fdULL, 0x15a817a13a9568ccULL,
+ 0x29bf9693329c9670ULL, 0x50400793370a901cULL, 0x6ed9bce86702c764ULL, 0xd32c71f13fa39db9ULL,
+ 0xb9bb1d8fcc0b3257ULL, 0xd645303fbab8a979ULL, 0xe83ab9bf5ea67b01ULL, 0xd13cf9dfc40090beULL,
+ 0x87495f30e480ea25ULL, 0xc00b5ed9f27a0cf0ULL, 0xf6f8d03cbd9be82ULL, 0x1ce625ac1a323834ULL,
+ 0x595e71eb8df23b9cULL, 0x4bf8f8376a273277ULL, 0xb020e03c7bc96850ULL, 0xabda005e0732d2ffULL,
+ 0x962c79bd0c9b035bULL, 0xa33715ddf1015fddULL, 0xfed0f2e4d88f6d59ULL, 0x9d0a936d711c72fcULL,
+ 0xa6dd6e063a32b997ULL, 0x803bd4a8aed65503ULL, 0x205c1ae9fc85b0e2ULL, 0xd34b49efb92fda6ULL,
+ 0x1095e47e083063ffULL, 0x69bdd68b0194402ULL, 0xdf8747a182527461ULL, 0xcd7247b33a2cf0b8ULL,
+ 0x7ec68f94b93c45c8ULL, 0xe12337c11966a5f9ULL, 0xebe9173ed7300bf0ULL, 0x5130be75cfe53e45ULL,
+ 0xa55eee5a8c241973ULL, 0xaeb09d4b7b41758fULL, 0x85739394252ed708ULL, 0x25f363e2c699c2edULL,
+ 0x4f63ca35701e4b0eULL, 0x4826e4bf7e3200bULL, 0x572f49c484a9f45eULL, 0x3dad1a0ad52fce0fULL,
+ 0x7969f6065a4da88dULL, 0x172dcd1b0ed5a5d1ULL, 0xef1ac6bda0b1a979ULL, 0xd027efdcd72c1c5cULL,
+ 0xec99777faf16cd37ULL, 0x1589b0e7a827733dULL, 0xcffbf14a4c5f1c7bULL, 0xd6dc5622d0bc5012ULL,
+ 0x858b1ae7f9cf8c04ULL, 0x31f24c8182ddf18dULL, 0x122d12b71af4f11bULL, 0xe4dffbd6a8708b7aULL,
+ 0x7ddb6722c90a583cULL, 0xacf1e21f8d6a516fULL, 0xc3c1d5d49f280144ULL, 0xcae38b0d7ccdd4faULL,
+ 0xd3f050c4adbe795eULL, 0x96dacb50f706955fULL, 0x4abe0006103c05d6ULL, 0xc3a919dedb879552ULL,
+ 0xdca1cfad7cf8ffddULL, 0x6421ede39dd938dcULL, 0xcfd3de74a0bf7c8bULL, 0x22709658bb56a833ULL,
+ 0x83fbdcaa41e34195ULL, 0xe5a9005b313d7721ULL, 0xb1b8a60b9b2f0a88ULL, 0x306499024b1859a7ULL,
+ 0xe7fbd9bb250aaecfULL, 0xc1a63c6a12c8da9cULL, 0x2a2280fd2e34cabcULL, 0xe078dcd889193cf4ULL,
+ 0xe19f470478aa8de4ULL, 0x96c38e2504972799ULL, 0x7ac62b7d83aca962ULL, 0x1709dae4433b83bULL,
+ 0xa2f81a0cfb3f601cULL, 0x11da43a2aca7f43bULL, 0x285247a09d9380a0ULL, 0xccf91b97f8533edcULL,
+ 0x8c723d80cc0777efULL, 0x9643f79c8c175396ULL, 0x8e63212dd1d85534ULL, 0xab9ba44ffcd976a5ULL,
+ 0x8eb7f612cd8c12feULL, 0x1f22a2e5d69e8ecbULL, 0x421ad06554f06e5ULL, 0xb0c2649430428efdULL,
+ 0xb08ae4e9e40f0d2dULL, 0xf35c21ed49e335d0ULL, 0xf295e325a8ee02eeULL, 0xcf4df981ebb216c3ULL,
+ 0x4ceee5911ed93808ULL, 0xa78a3e07060cec8cULL, 0x20fc3260749e6cc9ULL, 0xd369928c8466b867ULL,
+ 0x851c4fc24a67941ULL, 0x82d8e70648fc9eULL, 0x3efb5a978875d050ULL, 0x567530a8e9365f8bULL,
+ 0xbc300883b5105d96ULL, 0x2870861bf59e1b19ULL, 0x71f3a32435b76021ULL, 0x166d735ca63523bULL,
+ 0xfe0d8535712cf3d5ULL, 0x7ed084eafef0521dULL, 0x90d8a80485c90242ULL, 0x3c0655aa6f34b2e1ULL,
+ 0xb1223c2e25b720d2ULL, 0xcfe475da92a99300ULL, 0x9d72ad19c6baa30fULL, 0xc806625be7b30e72ULL,
+ 0xee6cffb7d3224f43ULL, 0x68ddb2510f761f5aULL, 0xe943660decdf718cULL, 0x15aa688019e75aa4ULL,
+ 0x68cff2a2819d6dedULL, 0x8503c04de368c36ULL, 0x80a8236733cebc21ULL, 0xa2a464be0c7f0986ULL,
+ 0xf1078d6dc4ad4909ULL, 0x9e697a91ec908e74ULL, 0xe8a29c4054a222f9ULL, 0x1f5c46dd89a72534ULL,
+ 0xfbe3ef56b9b93214ULL, 0xe9fb60f673cb36e6ULL, 0xe1a3341ea763d6daULL, 0x29237861caa78bacULL,
+ 0x915a529ade24c262ULL, 0xb6d73e2596e71f3fULL, 0x162e796eb353d726ULL, 0xa8293b3d70f8bf86ULL,
+ 0x2c4e07f483fe1eafULL, 0x9a63e21b48902722ULL, 0xc56e45c8c834df1dULL, 0xe3e6ef04a5bd525cULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0xcf66e6466ae15bbfULL, 0x5a618993d1f11498ULL, 0x7a123731c9dfe68bULL, 0x6bff1cd74ea775b0ULL,
+ 0xa96ba677f22503feULL, 0xf547b99af7335a44ULL, 0xc428d10514aded78ULL, 0x4f93608ee8f6598ULL,
+ 0x615ae6f4f88dfe0cULL, 0x4cc0f5e3141a2e57ULL, 0x15d808614801b8f4ULL, 0x5d30177b5d11ac27ULL,
+ 0x4ac8840d4a0a918aULL, 0x754f6435e5328a23ULL, 0x3ba6951e1abff225ULL, 0x94f4440b99a13ab5ULL,
+ 0x7ce06cbd702641bdULL, 0x6d61ded5bc5f789cULL, 0xc11e4f486e5bf39eULL, 0x932c4d59575f27d5ULL,
+ 0x2baf828d9e0409e7ULL, 0x32e61bbfbec3c4c2ULL, 0x18077144ff18ba90ULL, 0x4d52abd4f49d939aULL,
+ 0xf76f292e08966ba1ULL, 0xd38162f22a1d44aaULL, 0xb6a4add1df3f5a37ULL, 0x4d01f4e14f960512ULL,
+ 0x89cbe3451223d13aULL, 0xc0fb5b6b121f814bULL, 0x6eedbc7dc6893412ULL, 0xed54c62129fbca28ULL,
+ 0xf46c3fba6ae6ecfaULL, 0x42733fd0ea719dafULL, 0xc8c4b3cf050524ULL, 0xc387573b3075bcafULL,
+ 0x9700280974ce0b01ULL, 0xa11261f50cb6673dULL, 0xe35e5162843d9067ULL, 0x8502f8ff18bc021bULL,
+ 0x2aa18b10e6f429c5ULL, 0xea2d8042685f5b1cULL, 0x757ce2a03983b8f2ULL, 0x1502a560835f56f3ULL,
+ 0x91afe2eed42bd37fULL, 0x683bfd6d673f19a8ULL, 0x939eab09a8a21a72ULL, 0x6d867478c75fda02ULL,
+ 0x124a0d0affa32a75ULL, 0x1f52564db2c166d6ULL, 0xa11bffe4603064e5ULL, 0xdb4f49edf2be6ULL,
+ 0x53080e721c4f8d13ULL, 0x8b031c9f16c21f30ULL, 0xb2dcbe15f487b471ULL, 0x2d138332ab4f2955ULL,
+ 0x1f1ea2bc4479045aULL, 0xce4b5ddd7d492d58ULL, 0xd2a9c4b8b6592d0dULL, 0xae6e38e07a770a59ULL,
+ 0xcb7f0b337be26d63ULL, 0xaef5469a30e5bafaULL, 0xaf14d328fad1384ULL, 0xa0d8e59729c36b88ULL,
+ 0x5af62020ebc93167ULL, 0xf5f885219e2b5b00ULL, 0xa867c3eff066e8edULL, 0x6ef4c8134e1304b4ULL,
+ 0x4ed0a95e2f7e1b98ULL, 0x6e24c1b18224d4cfULL, 0x468d9d150a60000aULL, 0x8709fa5e17d848a2ULL,
+ 0x9344fa58922b5275ULL, 0x8cbf2b1fbd3d851bULL, 0x2c1b90fd0b2f4f37ULL, 0x402789ee48f4ec7dULL,
+ 0x31763e52fa62cde0ULL, 0x7923eb4f46f8a563ULL, 0xd89245070a35eed7ULL, 0x4ea56b61169ad489ULL,
+ 0xb8dd1d737e4a7252ULL, 0xa6665b1ddd7d72dfULL, 0x9577fc51438587d2ULL, 0xd87caae68ff604d9ULL,
+ 0x3631284e68f8d0cbULL, 0x2c05b8ff6d7b482eULL, 0x39959968eb36b69bULL, 0xc2ecd5e96edc4620ULL,
+ 0xe842bb3d2bbd8149ULL, 0xfe8bf1b97d423d40ULL, 0xf0049c631034206cULL, 0xc31e21afafbfec7dULL,
+ 0x8ab24c1dfe7af91aULL, 0x4ed6f8c2e5f1d1cfULL, 0x2bbdc8c681631abeULL, 0xe786faac39190a3bULL,
+ 0x8c30a77f5ea72594ULL, 0xdaf5a3072ed7287fULL, 0x9cc67f7397b8448eULL, 0xd4f871338768cb50ULL,
+ 0x9f5644c8f526dda9ULL, 0x3d40800e8f686c8fULL, 0xd8ee7a6d20b3588aULL, 0xb4eaed0212f54022ULL,
+ 0x7e5d29d80d036d3ULL, 0x861c78d7247be4f9ULL, 0x2282538fc4646568ULL, 0x5e09308b364bd65bULL,
+ 0xca5c278f67fa74ffULL, 0x9268a80ddcabc348ULL, 0xd5cbb7cd6374a225ULL, 0x658ef8682e401352ULL,
+ 0x15b82e17c361da0bULL, 0xb9ea692c5581128fULL, 0x359eef8c05fde6c9ULL, 0x7b17ad9a22f0332aULL,
+ 0x531ffda26bd60d5fULL, 0x7b51fb17aca98a75ULL, 0x4dfb157e1444ccf7ULL, 0xc9f08417b7d63debULL,
+ 0xaf02387099ac3c67ULL, 0xefbfb5e5d75d7575ULL, 0xffbb1c69993dd715ULL, 0xb39f4cbf36cf0316ULL,
+ 0xb5633b7d6e314a71ULL, 0x1e13ee39029042b1ULL, 0x99a8a0ea10c88333ULL, 0x300e6c210704ace6ULL,
+ 0x67bb4071db36505cULL, 0xdc40f0e41e28d3d3ULL, 0x13cee3093109d643ULL, 0x5ee2e6f00240a5d2ULL,
+ 0x182ac3c2a7953968ULL, 0x92b5ce1071faf976ULL, 0x65f479d0b1ffc8a7ULL, 0xe838a052412e4e17ULL,
+ 0xe21a3ee9744b0b86ULL, 0x3d0defee5953f6b3ULL, 0xf96d3c3adc2f88acULL, 0x62da3c3d7f327f8cULL,
+ 0xa9fcff07b998aba0ULL, 0x281126b7ac650bdcULL, 0xa1c7f620a7d7cda1ULL, 0xdcf4494519dd4de6ULL,
+ 0x9c6ff77666d5052dULL, 0x8a0acea3d9763a9bULL, 0x96ab86e5b2352e4bULL, 0x7d102af955cbcbe4ULL,
+ 0xf38548a46a8c3910ULL, 0x35d88d6733612d5ULL, 0x39be9a8a030bea6bULL, 0x7f1b4cc3143fd482ULL,
+ 0xf31b19e2c27529e0ULL, 0x9176014461953583ULL, 0x774252d59c97c52dULL, 0x3a2abb9b33224072ULL,
+ 0x3bf2e0e130d20b3dULL, 0x8d59512fb3fddf87ULL, 0xaababda8397dc3bdULL, 0xe28623fa8d807356ULL,
+ 0x759a7a5e3e4dfe3aULL, 0xbbc4b124072d305dULL, 0x9512470c9e294f93ULL, 0x2bdf6f9c0b6a369dULL,
+ 0xeb2952ce1dad86b8ULL, 0xc68689c60e2f303fULL, 0xafb287d15cd03f59ULL, 0xe4ffd394d07a4219ULL,
+ 0x43fecad1ac4ae455ULL, 0x1170e01bd0964907ULL, 0xa1f9d1e94d5c070aULL, 0x3239208348f558a2ULL,
+ 0x7c670ded4953186ULL, 0xf2474339c050edf6ULL, 0x87095d417e054273ULL, 0x4ad6c591a7789c67ULL,
+ 0x6e7c8175e01123e4ULL, 0xaa57b4a73ee3672eULL, 0xb19142fd0a981ba4ULL, 0x3930eb58ddbe3910ULL,
+ 0xab340b6fd0a1f336ULL, 0x6ac295c3de88c134ULL, 0x57f860b2e8db5bcaULL, 0x84e77fc39e89178eULL,
+ 0x8493b31ce87eff8aULL, 0xc4aefd6f4ab9196aULL, 0xd86706fff8419f97ULL, 0xf4a4301df481acbcULL,
+ 0x7e79cd6d9d5ce3ULL, 0xda3a928d7d131171ULL, 0xab54d48eb8cd7932ULL, 0x787a3c893f21f9faULL,
+ 0xd0e239e73019b8d2ULL, 0x8110c56c81acf1b7ULL, 0x57cae3cf2e86ac19ULL, 0x130f6bef6015214cULL,
+ 0x1ffc39421bf319cbULL, 0x1ec4d85f03279e5fULL, 0x558a133c7bf54c81ULL, 0xc148ae7e4050c08fULL,
+ 0xb2119d5c85752c5cULL, 0x47895ba7e76e573bULL, 0x928b7738c712db69ULL, 0x10bcadc6914e8530ULL,
+ 0x32365ab776b68c8ULL, 0x162cc3dafd4d6628ULL, 0x614aeb1b30a2f9a0ULL, 0x311a7d5bf172f983ULL,
+ 0x6c64c679ada7e4adULL, 0xe46728fe5f9a4423ULL, 0xe3edcc0afb5a9204ULL, 0x29df90f6d39dd5abULL,
+ 0xab02681672787c0ULL, 0xfb0afa51b0319069ULL, 0x9bc8408c7ede14e9ULL, 0xedff80fa60187bf2ULL,
+ 0x1d20aef596e5789fULL, 0x89c5d57494f0d5f0ULL, 0xca523ba83433cb65ULL, 0x4488f6e25f58ce8eULL,
+ 0x1f46cca64d3564f0ULL, 0x72aafeb7915204b2ULL, 0xe525b895eb3f1ce5ULL, 0xe75b9f1cf26908b0ULL,
+ 0xd2db24252c0c7fe2ULL, 0x107b9b10421e5588ULL, 0x93a8ea4c0e1925d7ULL, 0x61cdd95967139f12ULL,
+ 0x2d1841cf5b809149ULL, 0xdc5911d890284751ULL, 0xc63e57ac51ccc378ULL, 0x922025119f03d140ULL,
+ 0xece2358d12997d43ULL, 0x6c3a0a12345c788ULL, 0xec10b58c849ea5c4ULL, 0xca276a3469300c5dULL,
+ 0x7ff5b05268a04c03ULL, 0xf5a392b572df8f9aULL, 0x38b8119784796a36ULL, 0x5772f3f429e8abaaULL,
+ 0x1c1d070062d443ccULL, 0x4ad5838742917b94ULL, 0x1906cc8b15badffcULL, 0xc262925048a2b40ULL,
+ 0x8bb20cd4a85af9f8ULL, 0xb674844668d939a1ULL, 0xf6aa362de0c38ba9ULL, 0xb901da5a0d8b7aeULL,
+ 0x4258809b61701acfULL, 0xc08b4e02f6fcee0dULL, 0x7c47a7e177f058bdULL, 0xf6aa20f506380ee0ULL,
+ 0x1554efb65bc2138aULL, 0x8a8a8153ba9bf70ULL, 0x3278aeaf6f7c7282ULL, 0xe9a0eec0ff145682ULL,
+ 0x71794915f6d2a556ULL, 0xc9cff6207d9bf7c2ULL, 0xfbd0fb8e23fa79e8ULL, 0x85a9180f7728d830ULL,
+ 0x4ac938cb34d442e2ULL, 0xc4acf0cbc2ac1cacULL, 0x8060a95dcd4326bfULL, 0xf8fd8e12d3c08ee2ULL,
+ 0xda8432b7387a1f9dULL, 0x877dad0a0fc54e2cULL, 0x5d0884e225ed0702ULL, 0x3d1e28acc902fa31ULL,
+ 0x48a75921ba0e87e0ULL, 0x28b2148b16b5c5fULL, 0xc61ead8fa16d6673ULL, 0x5a4d2ff7ad0132eULL,
+ 0xc666ef2949ebc3c2ULL, 0xb2ee732f2cdf199fULL, 0xb268d1e6043ce304ULL, 0x310935ade75c2836ULL,
+ 0x95f8f0df609ff2c9ULL, 0xa2a92b95ff517441ULL, 0xd72e9bbf6fca9aceULL, 0x57ffacad00b9f3c2ULL,
+ 0x7d849bfdd49a8ab9ULL, 0x8e9930aaef6b9a35ULL, 0x3bdc603f08bea615ULL, 0x9d9bed6fe162b1dfULL,
+ 0xf2e188bd1342a9eaULL, 0x4ba409f563c243b5ULL, 0x62d4bc5ee79f8bf6ULL, 0x3ed3f2887872b2fULL,
+ 0xae5cb9e561bd34d0ULL, 0x26a539ae95e3b49ULL, 0xbbe40596c1b6cb18ULL, 0x304c7700a82b4c2fULL,
+ 0x78ffa071ece7c114ULL, 0xf4165ed80d305dc1ULL, 0xfbbfe49672a4703fULL, 0x360f23dc8d91ebf2ULL,
+ 0x48e2929a302e6516ULL, 0xbcc7dd8323783708ULL, 0xec7bd8154c298d7eULL, 0xe7143acb3d2dcf38ULL,
+ 0x546cabfbcd68beffULL, 0xebf0e995610cd4ceULL, 0xf2765d2545583585ULL, 0xc64514c231758de7ULL,
+ 0xe65b69a128283d7cULL, 0x5ff73da5795717caULL, 0xa14bfd85aef8582aULL, 0xe4a64ae3e00e4331ULL,
+ 0xc080d145f7fd0029ULL, 0xfc137448f8a4536dULL, 0x4f1571698d6bb16fULL, 0xb0dd76d405540114ULL,
+ 0xfad0a7eabc876d42ULL, 0xd5bcd8d9249db741ULL, 0x53bb6f5f55c9395dULL, 0xf863c46d23206961ULL,
+ 0xe58376ce9dd908c1ULL, 0x315a208706116a21ULL, 0xf2b24cf2c98a2f03ULL, 0x661707bc3d20c088ULL,
+ 0x1db1f185f34ae80aULL, 0x17816b73cbb09417ULL, 0x7e8ecb4683a06943ULL, 0x66d46ced2a34d2ccULL,
+ 0xfa0bfd80a2ae3769ULL, 0x1238e11e86e65d32ULL, 0x568aa6de5436c310ULL, 0x75929192cc91ce32ULL,
+ 0x524a8f573967230fULL, 0xf318a6344632ab58ULL, 0xa7285055923180ccULL, 0xa043bf7d442857faULL,
+ 0x6042e4d4ca902613ULL, 0x8296dac1856bcc6eULL, 0xdb954d2c402cbfebULL, 0xc613f823aa678c5eULL,
+ 0x269a96efc1b45344ULL, 0x36832f9e6ee96b06ULL, 0x9551825310b9bf33ULL, 0x427fd8f245ad859dULL,
+ 0x9621a7ffa637579cULL, 0x39a05c65c463bb47ULL, 0x75d5e41cb07fd3bdULL, 0xd29939a2fa2358f6ULL,
+ 0x3401b97706100f9aULL, 0x50cb893698259062ULL, 0x8a30e7362e53777dULL, 0xddfbb9438cc31ef0ULL,
+ 0x9ed8499715eca260ULL, 0x5e603e71dde6931aULL, 0x41e22c84620c6038ULL, 0x76fc5aad6d533aceULL,
+ 0x60c510f32d7fc924ULL, 0x5222f5d0f3804c5aULL, 0x551ea2cfed06a26dULL, 0x27163766b6a6874fULL,
+ 0x65d40db88fd248c8ULL, 0x5c033426b3f5c4fbULL, 0x11624b389c934542ULL, 0xe1050abed6abaaaULL,
+ 0xd0ec653e8515ec3aULL, 0xd71f9c6e0cb59c67ULL, 0x92ee0aa56ec47675ULL, 0x4295c89cc4716765ULL,
+ 0x3175b7bd44d5e3f9ULL, 0x8d48848efb5a16dULL, 0x546c17834a02af8dULL, 0x80a35489dc01c598ULL,
+ 0x2291d1f3722f9162ULL, 0x4248cc23f102b2dfULL, 0xc092ea06025bd9d7ULL, 0xe16b324d44ed1261ULL,
+ 0x2a4356ea0320caf1ULL, 0x287e952d7b95b116ULL, 0x1ad8e1f166ebb0a2ULL, 0xf9146cfa3a619095ULL,
+ 0xe346e6b378886f2bULL, 0x941718eca3c71d18ULL, 0x4c6c90298ffe84c4ULL, 0x8b8fb0205c158c57ULL,
+ 0xfc7eba83e577d9d3ULL, 0x2cfef02b997d18f6ULL, 0xd8aab6a99881d629ULL, 0xebd3f330fde2b447ULL,
+ 0x2c5df8c6a3e6a365ULL, 0xd8a7bbddbd87899aULL, 0xac5eca940b036b09ULL, 0xf67b1635023968bfULL,
+ 0x5d6717a19482b67eULL, 0xf2a1c8cd6d4ba255ULL, 0xd4d6afe45067d48bULL, 0x2d63944648b5e3cdULL,
+ 0xd95cd6db0451f740ULL, 0x41d177ce3b122ed9ULL, 0x4a26fac79e4b4ebfULL, 0x1cf841ef2e76f5cdULL,
+ 0xfceaf70b198e8e8aULL, 0x2695372192f46d97ULL, 0x8307fdd5f9677fddULL, 0xec27c8c955bcf13dULL,
+ 0xd0a5a1e330031e9aULL, 0x1a35d203b0e3a1d5ULL, 0x2a4c556fbcdf22dULL, 0xa492326633dd8fdcULL,
+ 0x1315d3a0f36682e8ULL, 0xd087d595bea09e96ULL, 0x994ddeeed13385e7ULL, 0x37ab379f32155e2eULL,
+ 0xfd12dfaa905660a4ULL, 0x68db56e7dc3d45deULL, 0x87d4aed1f4633161ULL, 0xbf7c014196e5fab9ULL,
+ 0x1102df7b4b771866ULL, 0x3e8fa7c88d658f0dULL, 0xe513abb14062ff0eULL, 0x5908de6743a0d0afULL,
+ 0xc2171a7beb07ad42ULL, 0x5722ff119ae3fad8ULL, 0x5fa74db13c55da44ULL, 0xeb38a0c23a649242ULL,
+ 0x986328805d211e50ULL, 0xa969dc66a872b720ULL, 0xe81374c99badb45aULL, 0x58ff57a0072018c6ULL,
+ 0x9589c25d92984ce2ULL, 0xe1bb6100e1862067ULL, 0x7ea23c2b09be7004ULL, 0x94d2463774c9529eULL,
+ 0xca4aa07d454a533eULL, 0x628a458b6972fd68ULL, 0x5dc132d39bdf4a1aULL, 0xc4c4190809a59640ULL,
+ 0x1794d70e30707a77ULL, 0x8f4e33c85045089fULL, 0x4429d1a2a421bf18ULL, 0x12f2296a3d7fd09cULL,
+ 0xbf1b7931337372a7ULL, 0x1dfb7554ad89c35eULL, 0x4f253cc306f8c653ULL, 0xeb2bfe2489c0916dULL,
+ 0xb23c1716438c5b85ULL, 0xcbe8886ea72653b4ULL, 0x9260832616c0bbf9ULL, 0xdf9094f771434495ULL,
+ 0xd854faaeb6b430beULL, 0x56e8a048c5908d0bULL, 0xeb55b153f245b736ULL, 0x5317df0da897162bULL,
+ 0x19d9c32d963e94ceULL, 0x1f28a6aeb09e2ddULL, 0x3009cf49284a491fULL, 0xdc5b9806bc4ea6a4ULL,
+ 0xaa1255ac6dd6dfe0ULL, 0xca4451a8a8fc8d8ULL, 0x85ccb564bd466069ULL, 0xb035876dbd2fe70bULL,
+ 0x74f1f26a929ead36ULL, 0x720b45dab852f545ULL, 0x833c0d0e39c817aULL, 0x2c5f3fd181600f7bULL,
+ 0xed08fd78bef340eULL, 0x3a0810b4384e8071ULL, 0x944a80979a7d6581ULL, 0x49d1f11f1fb23993ULL,
+ 0x21e8a59c8d271787ULL, 0xf5e33ae529171d1aULL, 0x18c1a7c9c7deee82ULL, 0x6755edfde63de4d9ULL,
+ 0x808fab6cca36688dULL, 0x95daaf9fb8c7bbaeULL, 0xd0782a8d065e94e5ULL, 0xbd3fe471fc640082ULL,
+ 0x4ee5da2ea4107b45ULL, 0xf65c554c9a5c669cULL, 0x364a363324963123ULL, 0x3625ab3d67bae25fULL,
+ 0x42fe8860c377d063ULL, 0x830ba19c7d6e7e9cULL, 0x9435ed40ae4e7adeULL, 0x7a5847a472add5eeULL,
+ 0xb7318b363bc2ef95ULL, 0xdf3efe641e2b1aULL, 0xb9b851f1eeacb296ULL, 0xbfdba455ed77679cULL,
+ 0x144975490d5e9a35ULL, 0xfa9a43167a43748fULL, 0x502e1497c324a173ULL, 0xffef3dc927be3990ULL,
+ 0x39ae8f67b29fcfb5ULL, 0x740807827ee978fdULL, 0xaba222178951d398ULL, 0x880f03c95544fc4dULL,
+ 0x1a1a676542c7bc2fULL, 0xd16eeaba86c89c73ULL, 0x47b6dde409ca8fbULL, 0x5ba2ebdb9d4fc327ULL,
+ 0xa76368c0df061db2ULL, 0x782f7d6af3ffb02cULL, 0xa226a3f9e015c602ULL, 0x9784a9f8a24abfeeULL,
+ 0xa58e3c170c8c9a1dULL, 0xe6fdd4fd769086e9ULL, 0x96de7ac081ad2980ULL, 0x17c3299341a1f2c4ULL,
+};
+#else
+static const mp_limb_t ecc_unit[4] = {
+ 0x1ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+};
+static const mp_limb_t ecc_table[2048] = {
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x1ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x22acc99c9e9f1e14ULL, 0x35294f2ddf23e3b1ULL, 0x27df505a453f2b76ULL, 0x8d91e471e0989cdaULL,
+ 0x6836c0b76640f110ULL, 0x60ddf2889a30d10bULL, 0x853d8fe391c22bb3ULL, 0x5b9ce67c6830bd12ULL,
+ 0xc19956a98edabed3ULL, 0xc9b469182d90df5cULL, 0x562d04277f1ad50dULL, 0x30b84053ffd24011ULL,
+ 0xf909ba0d54ab33a5ULL, 0x409a584722f55287ULL, 0x9f600f87aea6a078ULL, 0xc2b90ce46a83efcaULL,
+ 0xdc3c26a217cc5b17ULL, 0x66597a08117f0c65ULL, 0xf58e17d046c685f6ULL, 0xe6f681acf97118d8ULL,
+ 0x263343b133d17d71ULL, 0xf58a611e8fd0648ULL, 0xf361fc631fc24509ULL, 0x4e4d7c57b568f30aULL,
+ 0xa7fb2c3c9aeb8233ULL, 0xc483a0158220438bULL, 0x18a802ff94e49355ULL, 0xbaf075bbe109faf0ULL,
+ 0x87a19db950a6b00ULL, 0x31247ad1a519e50ULL, 0x92b89a9a858b1331ULL, 0x8a869a44a7d92af4ULL,
+ 0xfd2bb274938c5148ULL, 0x68a976778bc4a48eULL, 0x690b8eda1d152f52ULL, 0x8e919f6f9840e06cULL,
+ 0xd56ebcd12d0912f9ULL, 0x6d035c2a1ca297cULL, 0x71db5b9810bebc61ULL, 0x7dac74473979deb4ULL,
+ 0x9ccfe8243ab7e378ULL, 0xb9f3a56209320ec6ULL, 0x79358a856bd51812ULL, 0x10bb17833c19dffdULL,
+ 0xcddb3d1e2b3ec296ULL, 0xbf91ec26bb0215beULL, 0x40d48feec29dd720ULL, 0x27e84f6893ec380dULL,
+ 0x80bd016c85ff8188ULL, 0xaecdb42d914713c8ULL, 0x2655130aca4daf7cULL, 0xc1197a8d8f4c7a84ULL,
+ 0x4314c206f96023bULL, 0x981074da6252f279ULL, 0xf686b86d8687d127ULL, 0xed44d10cad0dd14cULL,
+ 0xc5d34dfa30027580ULL, 0x63b88d696e56007bULL, 0xbe451a280fdab8fbULL, 0xfce982d74333eb06ULL,
+ 0x9cd393c5d51bbc1cULL, 0xf48749d387b6d93aULL, 0xfdd7e52fd880a9c5ULL, 0x1bbfebf2b380f50aULL,
+ 0x90ce9525f15d6669ULL, 0xe29dc72066723c15ULL, 0x592a0be7c430a6c3ULL, 0x169c21461436f3e3ULL,
+ 0x8eb43fbb66295fecULL, 0x87c9580620d7dbf8ULL, 0x50116efdca7c7029ULL, 0xfb68a01657a902d6ULL,
+ 0x98c2f2be8ee4d63cULL, 0x73fd7c3cda53fc95ULL, 0xc73d52d01713070aULL, 0x7cc15cfd83c4698aULL,
+ 0x985512b577f61191ULL, 0xdee1d09096cb867eULL, 0xb4e3ffa5bdaacbefULL, 0xeabac5dc2feecefaULL,
+ 0x3af3fec08695b262ULL, 0x2357c7a1c85e58aaULL, 0x1ec15e86973b0561ULL, 0x724e9c897aa4b8d7ULL,
+ 0x5cc3e80045a5b2a7ULL, 0x556c5705298ae7e3ULL, 0xdc68e51485771b94ULL, 0x26842e64a6b0571ULL,
+ 0x26ae43ea740ef20eULL, 0x6d1efdb849267318ULL, 0x62b4cb315895348dULL, 0x21341ccc27c7fedcULL,
+ 0x6097110e4c4cd704ULL, 0x4a2d40fefd154eadULL, 0xa3f29a1d810a4366ULL, 0x27756ea852265c0dULL,
+ 0xfacff4717a431511ULL, 0xbc67450d62903aa5ULL, 0xdcfdc3178d44557eULL, 0x4593ed115cd59a38ULL,
+ 0xe98f0ef9f9e38b80ULL, 0x71ddf09743e853fcULL, 0x42153406620f53b2ULL, 0xb3c15d9373b5492dULL,
+ 0xd182a531da48ad4cULL, 0xf068ab3ac2077c85ULL, 0x1270f1b99b36b50eULL, 0x41b544faea148149ULL,
+ 0x79422cb9163ceef2ULL, 0xab58bfd566627757ULL, 0x1cc0e439eef2756ULL, 0xd44a63d91eaef1ebULL,
+ 0xe192f611229a5e95ULL, 0x85f6f05beb9118f9ULL, 0xba519b23a1865f90ULL, 0x17366cddef9e55cbULL,
+ 0x1a7a6070babc2544ULL, 0x5f54e061db75997bULL, 0xf77e68883a09774eULL, 0xdaa30467d63692d0ULL,
+ 0xd4ed64d4e65a41afULL, 0x71a915ca2182b1deULL, 0xded7512fe4f11454ULL, 0xe2d9e2ee4c148cd5ULL,
+ 0xc484fa9fb3db55dfULL, 0xc62dd13bb2026709ULL, 0x5983184764183ca2ULL, 0x4593bc37b3f4670eULL,
+ 0x5dcd553f5fdc0ce9ULL, 0x25350f9413995bd4ULL, 0x3b29a7fb90695b02ULL, 0xc3ca63f3869ea460ULL,
+ 0xb7ff7f8b2ea0852eULL, 0x4e10b75a71ca5679ULL, 0x10c4fc89accb9cb2ULL, 0xb2d8b0122cb4c1deULL,
+ 0x9718c49a5d7f9a23ULL, 0x5f8997738ae1f23bULL, 0x1d535e1276671699ULL, 0xecdc56fbce0e39a7ULL,
+ 0xb7b1192fc2b7f949ULL, 0x6406b181d9ce4e01ULL, 0x5d1e8513f1160f3dULL, 0xc0408fecfbc2c189ULL,
+ 0xffd4f2855b216af8ULL, 0x7e9add752cf54880ULL, 0x1b6c3a96996df4e2ULL, 0xc11fb2a88d61abe2ULL,
+ 0x5b073a13293c9acdULL, 0x651fd18ddf403ba1ULL, 0xb410a6b3b1a662d0ULL, 0x9c161017c0f38532ULL,
+ 0x7ae02cb4111b02fcULL, 0xd5c4086e82d64cfcULL, 0x96642b0c0e6427f3ULL, 0xe22c7524a3eff240ULL,
+ 0x2ddcc1acbcecb61aULL, 0xb341d0c1aa6262c5ULL, 0x7ea2fd33f18ec4f6ULL, 0x3370026a4b48c715ULL,
+ 0xe15e004f24eece34ULL, 0xbd8c309cfe4517f1ULL, 0x86fccb0f4bf00709ULL, 0x677a57d81978e7fdULL,
+ 0xd6d31749d209a0d9ULL, 0xcb3f257eb8780085ULL, 0xcf909705437a0418ULL, 0xdd7c16e6b3924e16ULL,
+ 0x2901db952867d320ULL, 0x444e11692641750bULL, 0x91d129b1cfe3396cULL, 0xec9b929ff1334e68ULL,
+ 0xb1494c26c40cd627ULL, 0x565b369947226a06ULL, 0x10e27ea4811ed914ULL, 0x1ec2fa6aab25cd3fULL,
+ 0x2d34f4954376d74bULL, 0xfcdba73ab0f04578ULL, 0x33801d8bec660c08ULL, 0x616fbc01174754b0ULL,
+ 0x9bca16b28c480b4dULL, 0x7d62c01bf790b3abULL, 0x4837315e1c5a0589ULL, 0xc5a6240a6d8a3ec7ULL,
+ 0x8b2440f5e5039ee1ULL, 0x72d5ef7ced6d1173ULL, 0xe35d854524e016a6ULL, 0xbb5a9b7051c3a99eULL,
+ 0x2709cd1d4470b8b5ULL, 0xa958d74e6e138a20ULL, 0xddd7ebe9b563097aULL, 0x3d040b1602bb891eULL,
+ 0xea49be602693ca30ULL, 0xfc56098e18527a8aULL, 0x5db5c832f066e779ULL, 0xc3fc8bf96ec094c5ULL,
+ 0xc58d2007d9f91ec4ULL, 0x4e96cebd63461171ULL, 0x907cad4ac520bd2bULL, 0xc2d8d7c5214ecf7aULL,
+ 0x23fd68198a469e07ULL, 0xac7ff4583083dd0bULL, 0x7b10ead7e9c2aeceULL, 0x34c2cd749e7cd3c1ULL,
+ 0x4f85a7a59991e029ULL, 0x9b3856856e8d639cULL, 0x35c85261e14fce4dULL, 0xa3a9b3439f7a17abULL,
+ 0xaa74eb655621c1d7ULL, 0x90a5677bddccd489ULL, 0x7c04914bdf03a11eULL, 0xe4960d8753ee1d3ULL,
+ 0x6c1c196f52014010ULL, 0x1a22eb5da5f297e5ULL, 0x7a2e8f2b3b593e29ULL, 0x43c77ccabce8b8aaULL,
+ 0xa03847b9af2cf081ULL, 0x3ded21a88d33c5e6ULL, 0x66590d7643899c6cULL, 0x17cd5e9ab76078f1ULL,
+ 0x8caa75b72c601f09ULL, 0x2e8da9bedb29484ULL, 0xee83ba21f5186cd5ULL, 0x55b16f1bc7cd177ULL,
+ 0xd7940572718d360ULL, 0x27028bfb83bc7946ULL, 0xeeddef972f24725fULL, 0x7d34e154047e1a9fULL,
+ 0x812f31e1810349edULL, 0xc86f6e9582141427ULL, 0xdc61259230456bfeULL, 0x833c1234c72f47bULL,
+ 0xd4d4d082efece34dULL, 0xbc07020fc503bf94ULL, 0xba600feb460ace22ULL, 0x6f45bba6c4ccf87bULL,
+ 0x466b693ca88af25fULL, 0x19b6b895c8b03bf0ULL, 0x523f21dbb2226804ULL, 0xa7464df69eb6baf1ULL,
+ 0x6470c9024675c91bULL, 0xf56ff94257df0faULL, 0xea08fc23dfd92170ULL, 0x3e5410e7dc014a4cULL,
+ 0x58ea2cccbe38b996ULL, 0xc5fc939cc4879dd8ULL, 0xecdef83672e225ceULL, 0x41fd079c35a2e6a7ULL,
+ 0xe224d60ee2c6327ULL, 0x59c19ffae84b5494ULL, 0x278fa36080f31046ULL, 0x3547d3ab4f024f2bULL,
+ 0xdf11d25194ae2043ULL, 0x2b83647910e36090ULL, 0xc7cee94702b89925ULL, 0x2e54114ef3c79f48ULL,
+ 0x31a6e7be7bcaa28cULL, 0xc5dbe8ce6b0aa73ULL, 0xf0c8e902660defa5ULL, 0xf4b830d26178bb9fULL,
+ 0xe3aaf927ac6511f8ULL, 0xa97e21d0c9f0e2dfULL, 0xdd51e86d33ed1acdULL, 0x1690e28ed72f729ULL,
+ 0x95e46a3ec522a944ULL, 0x27b0f9ccebc04a06ULL, 0x5ea0a6d2a4857a4ULL, 0xf5571162bc210d61ULL,
+ 0x895a98ac2530551eULL, 0x316f9d06dbc7c701ULL, 0x18fd92fa8ed29449ULL, 0x82a2fa7a1e73ae26ULL,
+ 0x2020bea0e7ec4068ULL, 0x901d0a5f47c82364ULL, 0x86ec99ba69e35109ULL, 0xec07b1f8908c799cULL,
+ 0x67ba38bb7d8d0e84ULL, 0xd8807ce079b8bb49ULL, 0xe5ae77e474ea39efULL, 0x37e3f781553bf9d8ULL,
+ 0x5338a0eb1dbe6e9ULL, 0xf6e5d36720b5e950ULL, 0x5ecf8e3b6166f4fcULL, 0xb81a9a1bb3dae2c5ULL,
+ 0xc6b77c789559e94aULL, 0x99e16dbe77db39bdULL, 0x57231d7a73f9f52bULL, 0x37c59b95bb414a27ULL,
+ 0x65e468d22a0fb21ULL, 0x580540af75ad1656ULL, 0x7f4868b986b99783ULL, 0x212779de49cddf28ULL,
+ 0xd26499b75bcbc0e9ULL, 0x44c9bce39e115ed4ULL, 0x1257f3877b9b04e7ULL, 0xb35962775e48c2f9ULL,
+ 0x626745ae6b0d2dfULL, 0x10ddc1ef1c930e3ULL, 0x44e1ec6e090a73a8ULL, 0xfe2b530a3eca96f8ULL,
+ 0xa43fd74206683e34ULL, 0xe65789104e2955eaULL, 0x7602f45f12544467ULL, 0xad55404ff85b3f45ULL,
+ 0x8b06ebf32a563772ULL, 0xde3ad7b32f959f44ULL, 0x81d895a8871b60a1ULL, 0x70827794d93ea59bULL,
+ 0x52691de023536f5dULL, 0xc49525208243e7f7ULL, 0xede00c51b0762307ULL, 0x241e5ddd2620c4d8ULL,
+ 0x166f39cb761abb9bULL, 0x5b436bec3d9d6905ULL, 0xe1003b6b99c3609aULL, 0xe44eaa5fa66680bcULL,
+ 0xdb9842dfe52dcc23ULL, 0xd1426fde3f91db90ULL, 0x7794710048d826a4ULL, 0xa7ce99e30fca163ULL,
+ 0xed71785217448896ULL, 0xddf14e48b3f856baULL, 0x8037dec023a45f60ULL, 0xe2d16df7532b3e66ULL,
+ 0xa7742c260c9150dULL, 0x5a1b4164631ba6cULL, 0xd2a5dac0ed1b7346ULL, 0xc67ba7e289bfcf87ULL,
+ 0xb7d401c1c52b721cULL, 0xcc4062c21491f07aULL, 0x99c8f147d4274b1dULL, 0x4c4bacddc47880b1ULL,
+ 0x174e49bf576d42b4ULL, 0xfe5f8760451899b3ULL, 0x903f1a81d17ec0e1ULL, 0x3f3a1f34d7cb2ad2ULL,
+ 0x3a88bd5f1c76937cULL, 0x4b8157c4dceab919ULL, 0x3c2d00b73f0ee857ULL, 0x7953912c909eeebcULL,
+ 0x868d23aecb991ae9ULL, 0xd05c200901fb0e21ULL, 0x17f532875be63e28ULL, 0x59badb610e3dc286ULL,
+ 0x753deec2b33bbc4eULL, 0xcb4d01dbc814e179ULL, 0x2f0e5cc1c8ea72ecULL, 0xd26c656d6b008874ULL,
+ 0xe79d85a09419f652ULL, 0xc9c0c574ca19903aULL, 0x9ab531752be3d9fbULL, 0xbf2b69b55a5dd877ULL,
+ 0xcdf820154a8451d8ULL, 0xc172f1fda995795dULL, 0x371c030b643078c7ULL, 0x44a9241aa6442800ULL,
+ 0x6d330db21b463de4ULL, 0xa323adc4e46070d0ULL, 0x1fc54fec6c0080b5ULL, 0xd1fa77d555026b79ULL,
+ 0x8e8e9c1e0424a311ULL, 0xb59c6fbeb924b1d0ULL, 0xca37ac191f0d524aULL, 0xa86d43c96411c011ULL,
+ 0xd7f5d9050beed4bULL, 0x1d62c2b21fe45082ULL, 0x86ceb3fb5ca194a7ULL, 0x19aeb622e04a581fULL,
+ 0x7ada5b899ca35251ULL, 0x40e424e780d42c9eULL, 0x3117a4da75f3c65eULL, 0x68e447dd54496986ULL,
+ 0x27ff5e9b74d09e3bULL, 0xb4dade6cd1c0964bULL, 0x604a983182b53ebULL, 0x216c5409f41dde76ULL,
+ 0xabd9e58da6eba4d2ULL, 0x93d45b04a151a63ULL, 0xd09a729865abf22dULL, 0xb32b9757a19a4a27ULL,
+ 0x136761876b89244dULL, 0x6960e5c3409a7b36ULL, 0xadbf33d588a5652eULL, 0xbe345840251daf9eULL,
+ 0xe1c44656381f2a17ULL, 0xafb0d78e7699e53fULL, 0x3f962dd99844cbe8ULL, 0x8be3c1149bddb070ULL,
+ 0x2c02f8f72b295e49ULL, 0x6425131e2c9b4ebdULL, 0x6c2ec910f6c163daULL, 0x43f22556d88f2a66ULL,
+ 0x188fa790be2785c6ULL, 0x7ee793485f0995cULL, 0xa0248cc637e0fdedULL, 0xb252d38364271b25ULL,
+ 0xc10c4904d1203060ULL, 0x92821c5c7757ceddULL, 0x3d845cb7e4eeb960ULL, 0xab077d1dcdea86eaULL,
+ 0xd1f84f858470dcbfULL, 0xe56596666e3eaa4fULL, 0xf14f2236221e272fULL, 0xc979e5aa1d9b89caULL,
+ 0x3439e0e178c99fd8ULL, 0xf3488cf154f937a2ULL, 0xda0f88efbaa8ce03ULL, 0xd5ea7724e65c05beULL,
+ 0xd1febafa353e694ULL, 0xb0d5f831af329ab3ULL, 0x4facbd3716a181d0ULL, 0x94790f90a5ab257eULL,
+ 0xc505b52e407563ULL, 0xf3ac918a146c6445ULL, 0xc69db98ae11f20a7ULL, 0xa9dc97fd8e4408f5ULL,
+ 0x692a0f35e896803dULL, 0x714e2e4cf9e11348ULL, 0x7919966ca8fa6833ULL, 0x1e54b9130adafa0ULL,
+ 0xd21336094f34b472ULL, 0x311d0c365c0b1012ULL, 0xbc9b10ebd8be1646ULL, 0xf75db61b82858aaeULL,
+ 0xf76bbe8f19022ec5ULL, 0xfedd18e14997df62ULL, 0xf23b559a457ec0fcULL, 0x87726c39ccf1a1daULL,
+ 0x5e8a9e3741e49050ULL, 0x6173d6ba047c6f55ULL, 0x3454b5879fa0bb40ULL, 0xe4daa7b84efedaf7ULL,
+ 0xbdd7b5786057fbd5ULL, 0xb2ff1d9a12083b07ULL, 0x8dd0891c35c128c2ULL, 0x4009e5796e72d2caULL,
+ 0xedfdf7e32b73a93bULL, 0x2b0bc22df4ef9ea6ULL, 0x3f0920ef82f4fbb6ULL, 0x4f91120344d13e68ULL,
+ 0xa5ee321888e4154bULL, 0xe4fb91043794ba6aULL, 0x4c5dd86a25634020ULL, 0xae4714826fb66164ULL,
+ 0x2be116841f4119ffULL, 0xf55900bbc259bb9fULL, 0x81a1fdfd2cd0d2acULL, 0x16982d5b4e5e2e32ULL,
+ 0xbe4172aed22def68ULL, 0x11e09527d9bc3f19ULL, 0x90e2908c1c7bce90ULL, 0x5dedce4a90953fcbULL,
+ 0xa9c97fe7c7b3c31dULL, 0x529cfdb1ac544be9ULL, 0x8d03a3b196210534ULL, 0xfe27b8d9ebb980bULL,
+ 0x88fbf55b8edff339ULL, 0x68f909096e7deb44ULL, 0x3e8550e02c908de4ULL, 0xb3ec2efbdc0cadeeULL,
+ 0x8063bf1a6c2ce62fULL, 0xd8c95a10cfb8b74ULL, 0x7566c0c492f490fcULL, 0x604be3841c42fac5ULL,
+ 0xa69f4c2445ecb9dfULL, 0x8cc76b118594b1d1ULL, 0x22c31b7290ca8670ULL, 0xf562180983b5f1aeULL,
+ 0x6fd053fd76d207baULL, 0x4b654c6d39a3cc66ULL, 0x548280b17f475f6cULL, 0xdce61263174e005fULL,
+ 0x3a7ae586fa06658bULL, 0x11b074be4a9aa7ceULL, 0x413148d3fc7e673ULL, 0x128fffbad2a819a4ULL,
+ 0x4f73eded7b63bc80ULL, 0xf24cea3892c844aeULL, 0x6854d801265b55b0ULL, 0x10fe4c6c83b07168ULL,
+ 0xe3ff450e6db44b3fULL, 0x36a5416ccbda76c4ULL, 0x92fd1cc5a4e36f66ULL, 0x52c3b94c47519fe5ULL,
+ 0xe0031f29bda5da29ULL, 0xc1fc942b7387eaeULL, 0xa52261cb1c0f194fULL, 0x6a29f7e5c1d27831ULL,
+ 0xae0b77b57a8f0ff6ULL, 0x2858b483e71b9e72ULL, 0xa273c575f620fe52ULL, 0x12ccd14da901db9cULL,
+ 0x618a15b5f467ae28ULL, 0x2c130aaae6ebde09ULL, 0x58550387574d5bfeULL, 0x81563078f4433ac9ULL,
+ 0xc69cec6aa04fd6cfULL, 0x766a3db0a8e8b01cULL, 0x9c5bbbae8c267169ULL, 0x50e4ca18ef7e0baeULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0xfa05ee57eca9fd45ULL, 0xbc13597e33dc9249ULL, 0xce729e7aa2ad4a39ULL, 0xcd862f8bd94e59c1ULL,
+ 0x8bca14acbdf628ebULL, 0x8551660bf592ebb7ULL, 0x7e1a4872cd24b88cULL, 0x8990cfc915a4df42ULL,
+ 0x73d684eb73dbd253ULL, 0x7bf8da2def16f1afULL, 0xca6d9191b0432e92ULL, 0x7149bddd78708e3eULL,
+ 0x35fd6ef5e8e3f01bULL, 0xc93852cbe2cd4a38ULL, 0x424a9908e4f1ceddULL, 0x3e706f356a4c24b0ULL,
+ 0x8a54055d9c56dc86ULL, 0xd377e30921b6ee4bULL, 0x85d7ed18b2d80a2dULL, 0xd1df7af031b01f3ULL,
+ 0xcd78e094ab647a26ULL, 0xba566a84e4001079ULL, 0xe3a8a875b5aa344cULL, 0xa716eef9cfd6ed9eULL,
+ 0xe43157eea2c19a8eULL, 0xe4704806c4df6aaeULL, 0x603bf6c2b5bc8254ULL, 0x871771b3e06b73d2ULL,
+ 0x117143be8eab200bULL, 0xb4f1dfedf43b9984ULL, 0x15d3f3449f58e7bcULL, 0xeefcca4df5396ae4ULL,
+ 0xf3b2f60cf9026f04ULL, 0xe5f9f4f0a79b8a80ULL, 0x2c7aa915f30318ceULL, 0xd9c82f928e87f382ULL,
+ 0xd323e5774f1677eaULL, 0xdb5845d8965c4dbcULL, 0xed44c0e36d43dac0ULL, 0xc7a81eff8385cfceULL,
+ 0xf2030b941a0e6919ULL, 0xe2a644db85910178ULL, 0x7e83f9290d284cdbULL, 0xb6654a1271b8b5a1ULL,
+ 0xc593eff9b338107fULL, 0x3cf126c34b063ffdULL, 0x4d7665fda2c68c2aULL, 0x5e247fd97fc6582bULL,
+ 0xa60f6abc089d65f4ULL, 0x77ebdee0e25388aeULL, 0xf62a19e555d0aa17ULL, 0x746a8fc4ccb0aa35ULL,
+ 0x420bdfa06e11d5f5ULL, 0xe4cafedb4d2d1d28ULL, 0xe4f7b9924dee025bULL, 0x4ce1afdbfdd92e50ULL,
+ 0x31e7d54414e07cfeULL, 0xda896b6a779ad221ULL, 0xd0c9af7797408a4cULL, 0xe1687978f7fce206ULL,
+ 0x12bc782df1af973cULL, 0x7dd66c9e0bfea93fULL, 0x3693eaa43b55bb30ULL, 0x89db2399becea4e9ULL,
+ 0x2aff7a48e63ac60fULL, 0x62f17ce5defe4c24ULL, 0x1863705ca1effd9aULL, 0x15576db21b395ad4ULL,
+ 0x5f305d90409914eeULL, 0x1db73f60e02ada0fULL, 0xcc64f3efd47d2a0bULL, 0x70f50fc3b1c58433ULL,
+ 0xf642f70baa2d64a1ULL, 0x7489a46e2c07f72eULL, 0x761038e1a4050beeULL, 0x9652702df50db12fULL,
+ 0xcdbe3f7c6c622b6bULL, 0xb900efa0500ee81aULL, 0x1c69ac3519dd119eULL, 0x8ebb18e24b7aa505ULL,
+ 0x5e90d5e7da47b623ULL, 0x33ce90defc6142b6ULL, 0x91135fbc22f4d4d1ULL, 0x6ebd4e9acc804b81ULL,
+ 0xd742ac5285d1cdf0ULL, 0xe455771fdc5add69ULL, 0xe4e531fa802cf323ULL, 0x5802e811ce822bdcULL,
+ 0x44393dc5f7052323ULL, 0x117987db41fb5852ULL, 0xb51dddae99c916bULL, 0x37c213a88375542dULL,
+ 0x996939843058ecd8ULL, 0x459a74a2b0bcf2d3ULL, 0xf0a06e1b20058157ULL, 0xce4c9f17901c3fb3ULL,
+ 0x1a49f05782bd6510ULL, 0x526cf2db60a92c9bULL, 0x25da9668dc12ff8eULL, 0xf0d66e059a8fd817ULL,
+ 0x5fce8afb0850ed00ULL, 0x78ee95cad309252bULL, 0xded78b3b130413b7ULL, 0x5ac731d8298fcefaULL,
+ 0x5338f243034ae724ULL, 0x97858a25998fadb4ULL, 0x7690c51edbce408fULL, 0x3216af8c4c8dd115ULL,
+ 0xbc6d089fe5b22655ULL, 0xcca6efe5b441c880ULL, 0x62e424e3e87a6165ULL, 0x86de40b88c753d6bULL,
+ 0x7d07b1978bf0c8b5ULL, 0xf4e1a98feb1ba739ULL, 0xd95de43a03e8937bULL, 0x90c11e8cd56761b6ULL,
+ 0x8925919d6952f9b6ULL, 0x142004cb89e59b82ULL, 0x2e75d65cc6c2380ULL, 0x5fda85298ab424cdULL,
+ 0x5af6a75148218760ULL, 0x245e5f014a9100f4ULL, 0xabf3c3a96f7c1f01ULL, 0x81d0a48042942affULL,
+ 0x9a28eddec35734a8ULL, 0xab7420af41ce94acULL, 0x4ef14ad912d38ce7ULL, 0xe3b34d780814f295ULL,
+ 0x7fa8928e1b168f0aULL, 0x9ed80d9281441d0eULL, 0xe0a4c053cb17016aULL, 0xb060e159e1eb0ab3ULL,
+ 0xd3c899380073cf5dULL, 0xbf6f4b06154018d1ULL, 0x4a58327be1d39c76ULL, 0x818c3c2d2b65456ULL,
+ 0xfd44e23481845112ULL, 0xda75bc16f3e5dd85ULL, 0xbe603900cc1e5ee3ULL, 0xc700c5040615958fULL,
+ 0xc87c45e6e1f09839ULL, 0x3d50f0c5b0eec9c1ULL, 0xf4e2956f8c341f03ULL, 0x49ff79476f57e105ULL,
+ 0xaa6e777ad98af87fULL, 0x98356fca9bb96572ULL, 0x239c3924a4aa65e6ULL, 0x811f2a6e8c2b34eeULL,
+ 0x2bc98d580c8ee27eULL, 0x802cbaeb9fdb9c2bULL, 0x36a06f59848f623eULL, 0xe36b40eb52490dd2ULL,
+ 0xe4947ad9538d8907ULL, 0xcd5bdc39e62d19b4ULL, 0x75f8992b8f63dce5ULL, 0x7ac5dd52b213da2dULL,
+ 0x3ec0216d936ef602ULL, 0x639babdd5bfea75ULL, 0xd090094be314ee9aULL, 0x7ca06ed501c3bbb5ULL,
+ 0x12e35daf7e1a6553ULL, 0x7622a13dbcf1beddULL, 0x123460ba3eeb91a0ULL, 0xe51b03976f5a54a8ULL,
+ 0x9c3a913494217cacULL, 0x19738e3eb3df239bULL, 0x64fd004bd05bcd8fULL, 0x8362c7e5874846b1ULL,
+ 0x61c4e99125cf24e0ULL, 0xc55eb42b58147745ULL, 0x43657f618c4c55eULL, 0xfa1ffe30560559faULL,
+ 0x217593dd1b69426bULL, 0x5ff11cd8686d44d6ULL, 0xc47f6b493304dc7eULL, 0xcf7be92ad9ba75d1ULL,
+ 0xa0b993a3c60e68a6ULL, 0x5cfad13eda072305ULL, 0xe251d5844077cff0ULL, 0xc4abe3960b0c1f6cULL,
+ 0x7ef517b74677d26aULL, 0xdc391c241cd6b650ULL, 0x15113f8c33fa6ccfULL, 0xa669baf60b008ae9ULL,
+ 0xb4e4523f855b7a00ULL, 0x1ef94b7137602a4ULL, 0x73c7786fb1bdd1cULL, 0x1a923e7315c001bcULL,
+ 0xa8b725d65a8ddab0ULL, 0x74114f3ef8bdc9f6ULL, 0x6bb95f50f70f0899ULL, 0xb3a6232c454c5197ULL,
+ 0xc4cc67bd06b2e45bULL, 0xcfa311a51cbf8e35ULL, 0xf190316e14a59d7eULL, 0x7fe2d6720dea2e7cULL,
+ 0x9ad852b021e28233ULL, 0x8be9814c69f42e14ULL, 0x116f091b9e69ea80ULL, 0x58891afbf7c06423ULL,
+ 0x12a263aadd05ebc5ULL, 0xdf4129c765a38e8dULL, 0x19099ad6300d5504ULL, 0x5df2f3c02b927d6dULL,
+ 0xf9e333e7971f9246ULL, 0x4ce8e0b953442ec9ULL, 0xb0a847ec45e873f2ULL, 0x98eda4ceb1b9ad84ULL,
+ 0x26a2c9820d703b56ULL, 0xb7095b373220f382ULL, 0x123d70674e631a6ULL, 0x5fafd1217162a47fULL,
+ 0xe26a24c0cc4ca4f9ULL, 0x1fca43973f1173ULL, 0x8eac25873f9fa80fULL, 0xe602f77fbce1937fULL,
+ 0xa800901a3e8aa1caULL, 0xada4f9ddf0cbe9c3ULL, 0x20a99c487295a9f3ULL, 0x4da4b8dab6365015ULL,
+ 0xd5727a863a78d4e2ULL, 0x16d782117f61a808ULL, 0x354ad399ef6e7bafULL, 0x4f964729be902f4aULL,
+ 0x9f51dce80293b863ULL, 0x76399dc0366ad787ULL, 0x7dde92d967b11ca1ULL, 0x4d81052326e2237fULL,
+ 0x3d2099cfcb15530ULL, 0x1ffa4a142b3693a4ULL, 0xe8ac94f6b4919897ULL, 0xca5f42ee6cc53beULL,
+ 0xf8d5eacc5b011084ULL, 0xd877f17467ba48fdULL, 0x8c2687737103ca38ULL, 0xfdb7137f85422eebULL,
+ 0x1a86fae65eaa901cULL, 0xec8db31073f1eeffULL, 0x6c68ddb9d6fdd9ecULL, 0x7e08b875d9ab68a2ULL,
+ 0xf2c994d38c640fc0ULL, 0x56af2c19fb26ab3fULL, 0x1ee09d81c441cac9ULL, 0xcdadd7dd5fb625b0ULL,
+ 0xc591b1f135be2478ULL, 0x90134ee82613cdb2ULL, 0xb51aea23a6b101efULL, 0x1e960a8145aebd04ULL,
+ 0xfa041296b1e76d89ULL, 0xc867f4dd370329deULL, 0x484e016d278dcc58ULL, 0xb0f2dc0bd4dcb8c6ULL,
+ 0x9e0a2516ee54a4c0ULL, 0x5ef3cdf7d2dae2a9ULL, 0xdec80fd26f8a96c2ULL, 0xdcd963d106303430ULL,
+ 0x35e1821df3278302ULL, 0xa823e4a0b3755505ULL, 0xa43c99a7a9bc83dcULL, 0x79d4d22b55c7908bULL,
+ 0x4656fe8e2a1231eaULL, 0x6e802130890645d3ULL, 0xee0dd8b89d385125ULL, 0x956aee3fa9c34b85ULL,
+ 0x9c01bb108ce98fc2ULL, 0x9fe5c60c49f4c4c5ULL, 0xe25dd6ebc6c740a4ULL, 0xc3fc82b1dc4d9888ULL,
+ 0x87470ec88883a8a4ULL, 0xc135bcd2948b6317ULL, 0x3cdc5dfe31516863ULL, 0xbdf4ee7c8b2aa2f2ULL,
+ 0xaadef06e80344817ULL, 0x2d69c2fead36106ULL, 0x29b0b877be8cc9d9ULL, 0x541c3f0e5a8b033eULL,
+ 0x5af509f6a9d91bcbULL, 0xc90d4910f2c9c952ULL, 0xf693e1e3ef621daULL, 0xb9345bb2af6f89f5ULL,
+ 0x2060ebf1c1b44b85ULL, 0xbbc9eed5992372cdULL, 0xd7ecd0d1a1b03950ULL, 0x9edea3ff6ecebb90ULL,
+ 0x6d4dc697ce919ae2ULL, 0x9607ef7445762998ULL, 0x5c8772ac05ec6120ULL, 0x9fb65b62032fb9c1ULL,
+ 0xefd0d1981362e055ULL, 0x41d49ac693160d3fULL, 0x27aadadd86d0631ULL, 0x8d6972c830ecd6f1ULL,
+ 0xc2db09305764f666ULL, 0xf755df699aeaf129ULL, 0xa12d2c7f1cbbd0fdULL, 0x56e9101656ea407cULL,
+ 0x7de6f8ff00b2bb9fULL, 0x727ed08ac15d2154ULL, 0x8df19701e2e6a2faULL, 0xe16408763f2526eaULL,
+ 0xd784134303cbf965ULL, 0xb1422e079e026a02ULL, 0xc85a1b54d303c2d4ULL, 0xe0a02b8ff1ed5459ULL,
+ 0x9e7a81c3dd3c00f9ULL, 0x6a7f391cb92a3c1fULL, 0xd02085c119ca163bULL, 0x380d4c72e74125c5ULL,
+ 0xdae49d09acc9200eULL, 0xab99fa12bd4dcb3bULL, 0x842f03df71989736ULL, 0xf33be83ecd193533ULL,
+ 0x3ad6ad4d1e989afULL, 0x5310b5ab4f5aef09ULL, 0x13faaf8e5000bdbcULL, 0xd685cad8f351fb32ULL,
+ 0x7eb1718335f8c0ecULL, 0x890501e9421a4649ULL, 0xa6f049b32b265a88ULL, 0xa2e5fd8fc18dd298ULL,
+ 0x7401af94f2c75eedULL, 0xcbbb6b708bb87aaULL, 0x5cb0d1b92bd6cd79ULL, 0xf84e0f52851c9d2ULL,
+ 0xaa44be67d993af58ULL, 0xbb52ca9580762a3cULL, 0x832c111405e6827bULL, 0xc545bb8418759df2ULL,
+ 0xa9f0ce51b688375bULL, 0x891d1ed827769b18ULL, 0xc3c14bcf91c35b42ULL, 0x3c6b746917008543ULL,
+ 0xbc4c5abacb879681ULL, 0xedcb6a102b639872ULL, 0xc69effe4b8e4bd91ULL, 0xb707c43fb43d8f5ULL,
+ 0x46e00d60673e049cULL, 0x85358a7726198e8aULL, 0x66ff6f2b94e617cULL, 0x7e764d67727985ebULL,
+ 0xe0582d4ae3bf6ffULL, 0xfcc2f0d84206f3e3ULL, 0x8c0516c777f9a3fbULL, 0xda21783d9d722681ULL,
+ 0xbf8005efeb56eeaaULL, 0xe9988bde436209a9ULL, 0xafd6212b41d5a9c7ULL, 0x190dba3406de7caaULL,
+ 0xaffdbec08b21caceULL, 0xbb80423f36f5edcaULL, 0x3f47abc7c1c41993ULL, 0x66ccc53862710674ULL,
+ 0x42fcb32e3736ff9eULL, 0x74d9df89925aea65ULL, 0xa76776edaf77a2c4ULL, 0xbe113bbc90124fccULL,
+ 0x90911eeb66355239ULL, 0x62683c211866effbULL, 0xc138627569ee510aULL, 0xde12de46780e6757ULL,
+ 0x20409c8a84d83722ULL, 0x53cdf1745f226bcdULL, 0x74b06fba50505fc6ULL, 0xe11579ec3f203af4ULL,
+ 0x74d01551baa5f99dULL, 0xa02683c6ee9e29b0ULL, 0xbfa560c73dd7cda9ULL, 0xfdc6302cf985369bULL,
+ 0x620aa9b771ea3891ULL, 0xaaa2b51d8fcfca13ULL, 0xa08bed66b31d7edcULL, 0xf08d26fb4e80fc1eULL,
+ 0xbc9dbe0b6e657ff2ULL, 0x4b82519e3aec73d4ULL, 0x836b84ed3cc29adeULL, 0x32a34b2a023868dbULL,
+ 0x6945fd8672537c6cULL, 0x59f45d155e33f95dULL, 0xc90cc7a26cd2d51ULL, 0x645debf6b0bc4bbULL,
+ 0xc66f8b425f60438cULL, 0xe0362c64f7c99a43ULL, 0xf5534e73d37ee435ULL, 0x4e68f74b503449b3ULL,
+ 0xa5d5cc1414085d6cULL, 0xb02f5d6bf0bf1735ULL, 0xa6990de53fb15cc1ULL, 0x34594a19c40839dcULL,
+ 0xa2f4bd853845af87ULL, 0xdff68d0bb1ff1db4ULL, 0x1b1fa51f5b822c01ULL, 0xd5e051d007e2ab83ULL,
+ 0x6c722589bc12bfafULL, 0x74873932f7975fbbULL, 0xc2b38b5eb6190a2ULL, 0x544af06327651be5ULL,
+ 0x117bd6b10482c2c8ULL, 0xeed43d8849291d49ULL, 0x46d85ea06a09a964ULL, 0x205af1f121d743ffULL,
+ 0x23b63d8e3c8aeb2ULL, 0x9d4a1c32a1acb8c3ULL, 0xd77077341438e712ULL, 0x727cb55d875ebfdcULL,
+ 0x3b28b4a5f4e43a3aULL, 0xfdd793c1bca7a2e1ULL, 0xfb3a593dc398ff6bULL, 0xe32e82957a8d0a42ULL,
+ 0x2e1a054dda19ad94ULL, 0x3c3b744730fca24dULL, 0x1e1949b9309fb4c3ULL, 0x7854542373657777ULL,
+ 0xb1e37d19d2ef3735ULL, 0xd20716f1e8ee3342ULL, 0x2e4eef9aef7e8bc3ULL, 0x149c6b763b5a573bULL,
+ 0xb767f9cebb515a31ULL, 0xb3f7777e2e34e006ULL, 0x7ab1d275dcebcbdcULL, 0x918b2a08a7c6b7bULL,
+ 0x2b7230523cc25147ULL, 0x9ad97ade814daf42ULL, 0xa4a221f21e2f64a4ULL, 0x950d2c9df30764bcULL,
+ 0x11a6e0e71dc1e8f0ULL, 0x1da16abecf72e283ULL, 0x12dd4db2222eff71ULL, 0x8e004808b307f1d8ULL,
+ 0xe25aa7a97931164ULL, 0xc06266c7dc3fd1f5ULL, 0x697b17b2f1f66f02ULL, 0x9e7976760599eb32ULL,
+ 0x6badc54c7dbf0315ULL, 0x81baaf1a05b2ca4eULL, 0x43cf8b159cfe8900ULL, 0x16f392d2ab77f2eULL,
+ 0xd8f16810d44a1780ULL, 0xf058c02579bd3e71ULL, 0xf4661b4950df32d6ULL, 0x4b1b76c81a15be44ULL,
+ 0xbef157c8c64e86e2ULL, 0xcf00577c16cd18bcULL, 0x93cf98cfa74c2771ULL, 0x2136f21a64eaffb2ULL,
+ 0x7b1b713727bd9662ULL, 0x8265f8501ab2cbbeULL, 0xe3cb025b5e82cadaULL, 0xe6116608c7dd3cbaULL,
+ 0xa2dcd867a2ee860cULL, 0x4dd0b5ceb1877597ULL, 0xdd6a5c346b386c51ULL, 0x2e6037bc80e0a4c2ULL,
+ 0x9113939d6693cc4cULL, 0xbd9399bce072daadULL, 0x9f694cb95fccb621ULL, 0x425d3990e319369bULL,
+ 0x67a59433f5e7a6bdULL, 0xef9f3e0a3844ee1cULL, 0x5182d18d1f2cdaafULL, 0x74be4e07528c5baeULL,
+ 0xcad8d6f11a5c23ceULL, 0x9419c8bae56c2ef5ULL, 0x6349a3992de672bULL, 0xe0dbcf267cdc015cULL,
+ 0xe2450c00f9758e1fULL, 0x573509f17536e1aeULL, 0x9dd391b6676b67f5ULL, 0xcc50046e92de89acULL,
+ 0x9f33df02f5861321ULL, 0xcddefb6e4c0201aaULL, 0x4b38181047794e02ULL, 0xa72fef18675d7724ULL,
+ 0x48f36bf384778143ULL, 0xd3e40fc553320f51ULL, 0x3a5ac83ec1b61806ULL, 0x6688dc6a8622703cULL,
+ 0x5e86e76a7565f8c1ULL, 0x8a6095393a8d7cbcULL, 0x177e6da04e33f520ULL, 0xc76b91637bd2e76ULL,
+ 0xa3bdced9ea8b9be5ULL, 0xd54b48015c64e6cbULL, 0x2c20a921c8ae77a0ULL, 0xd51b4bb03f576f0cULL,
+ 0x48645268cb15aed8ULL, 0x67e4765245f6cb7ULL, 0x3cbf7771a89828b3ULL, 0x795012ed1a746545ULL,
+ 0x166ec7324e072e02ULL, 0xd4960d42bccf3b6ULL, 0x63d52aa809b7230eULL, 0x13a383085a139800ULL,
+ 0x25354b9c323d9b4dULL, 0xbba131b625564a72ULL, 0x6fec35eaf2c83dd0ULL, 0xe8ebed977f9547fULL,
+ 0x77e3cb888cfa0deaULL, 0xc56c499f280f9f3aULL, 0xd7f698eff90266a1ULL, 0xc737d9b538c573b9ULL,
+ 0x7b734b05cb84c1c8ULL, 0x9c1163d6e950b815ULL, 0x397f039e10162e12ULL, 0x1098cd83b225a634ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0xf32f75c7e162bd17ULL, 0xd56502e20b517821ULL, 0x778098a7f8bd2ebcULL, 0xb70ce07a1fb4e8baULL,
+ 0xbe695f999002587cULL, 0x889bb8e3e678f51cULL, 0xee0100c6b8648541ULL, 0x56cf6a4b7c4a2021ULL,
+ 0xe1d486b829e0e89ULL, 0x65d8d44580f031e5ULL, 0xbe2523cbdcccc0e7ULL, 0xcaaf4b37843381ffULL,
+ 0xf40616ef2d69fec0ULL, 0x30f89eddf88452c7ULL, 0xce77a067d3b895cdULL, 0x43ea1afa0daf2d1fULL,
+ 0x5cce79532256e0b6ULL, 0x980540776aeefa1bULL, 0x792c11efd453c698ULL, 0x8a97f51383483ef5ULL,
+ 0x643c724f4035fd0ULL, 0xd274694ed52c492cULL, 0x522ecfd69b8a5728ULL, 0x861b425ec432d14fULL,
+ 0x57c3dc8c116588fbULL, 0xc3d51148bc5cf0c1ULL, 0x433b76af777bc09bULL, 0x1230810a9d01f220ULL,
+ 0x2340865aa7b63bc9ULL, 0xf1a18044bbfb3906ULL, 0xa9f8920d1c8179fULL, 0x642f65275c870d40ULL,
+ 0xf3073a0a04d02af4ULL, 0x9dc6bef611f5010ULL, 0x6a671ba02b71f696ULL, 0x40508621e71dd26cULL,
+ 0x50405743e31d0d58ULL, 0x15971e6e8b8a46e8ULL, 0x451611977afc10ebULL, 0x814f3af4ba44cdf8ULL,
+ 0x177d66ccaf1dde65ULL, 0xd6dbbe7c44dd8038ULL, 0xeefac7b626764a5cULL, 0xca185df64c695809ULL,
+ 0xb59c2a9ce9270ccfULL, 0x79d4fbb89c07f378ULL, 0x24302f81e54c402fULL, 0xb64307168701c246ULL,
+ 0x599980e9c32946d8ULL, 0x8121ac908d5f1cbULL, 0x18256d95946884f3ULL, 0xdc5c79fe30ec1ca4ULL,
+ 0xa7089ecfd06beae3ULL, 0xb7769bd35adf88f2ULL, 0x60ce2b077a2f2dc4ULL, 0x79367a206d6b02c1ULL,
+ 0x6bfa20a5a11aee99ULL, 0x870786658f7c4c59ULL, 0xd72eb785718acb6eULL, 0x4976d30efb733ff1ULL,
+ 0x26ff47ee95a31e2eULL, 0x5647f36090bcad23ULL, 0x8c2233a4bdfc25adULL, 0x4a657f0cae19ea20ULL,
+ 0x1ede63789950f0c4ULL, 0xacc9f8e030b2ed8fULL, 0xd044a50d50529b5ULL, 0x158e39d87b56999cULL,
+ 0x914aaa95b48ec67aULL, 0x2158a70914f418b4ULL, 0x9f04f177b30b1c0aULL, 0x64295e2d6a5ca00aULL,
+ 0xcad956bb4713bcd5ULL, 0x7db646c9a9dc5298ULL, 0xeaedf191406ab159ULL, 0xc883d8adc3d93f5aULL,
+ 0xb98c434660f0a214ULL, 0xc8f0fa899e513024ULL, 0x43f8ae944fb7087cULL, 0xb701e28e0dca341aULL,
+ 0x5a48206e9844e267ULL, 0x2b2abb4a6c385faeULL, 0xbd2681c4bf2c8522ULL, 0x929f2d48d617ff69ULL,
+ 0xfd75187a886356f2ULL, 0x8f8059f5b3f1a36bULL, 0xe77ce033f97f9b88ULL, 0x173c385f36aece59ULL,
+ 0x7c67140f8182c3f3ULL, 0x7e06574d3aca58e3ULL, 0xfb34ec44080fc4dbULL, 0x22f30726485cd3c9ULL,
+ 0x720532111c0828e4ULL, 0x80a94bb1402f599eULL, 0x3ecd0f16a1eff441ULL, 0x31da126606d89218ULL,
+ 0x38450ec94a192e08ULL, 0xe145450ac1c6f751ULL, 0xbc3a7f2bd3ae3e5dULL, 0x93e4d514d4d1e289ULL,
+ 0x897eaa219b5b21d5ULL, 0xfa9c65cfc821e73ULL, 0x35ef133569520d69ULL, 0xfa0724541997908dULL,
+ 0xc7633da02b8583ebULL, 0xc6c6a87590459fc8ULL, 0xc9d31bc7f0181e94ULL, 0x5c0cd701a8b480b4ULL,
+ 0x714e33b74fdc5e9ULL, 0x8692bd199e104bb4ULL, 0x2f7a732767c7f8d6ULL, 0x417b7c41dff2b229ULL,
+ 0x5b191bca56c6e3a6ULL, 0x42a15a29248240f1ULL, 0x4f076058095ddbafULL, 0x10059ed921f3c711ULL,
+ 0x7e2629b49d2421ffULL, 0xf1703c167880d1c3ULL, 0xa6a1246323af57e5ULL, 0xc656c351dadbd763ULL,
+ 0x39e4d8ae18d574e1ULL, 0x95d901a66847f0ffULL, 0xfddb879c72a3408eULL, 0x71847016e9f47a2eULL,
+ 0x8604baf32e6b3496ULL, 0x858336b392d2d665ULL, 0x18fd011a808e08e0ULL, 0xc52916a50ea232e8ULL,
+ 0xca85d855453f286aULL, 0x1394f41202917375ULL, 0xf10af5d322febaccULL, 0x51a61b619ed142ecULL,
+ 0x4d1bff197c1f3ddcULL, 0xd2bd2941a34631fbULL, 0x9336ac3a6fc624afULL, 0x5d5c8e7493b16b16ULL,
+ 0x5e27e6e697719921ULL, 0x33c5524ca5e4975aULL, 0xa3cbdfb01aa3e221ULL, 0xa0ebc22449d1ae9dULL,
+ 0xa372bc6dceadb418ULL, 0x8eb90493bae420e4ULL, 0xa73d9a4a33e78933ULL, 0xb3543547b2655c07ULL,
+ 0x4583d64b6ede0c32ULL, 0x402ec0d60fa60eb8ULL, 0xa290e440d60f3781ULL, 0x951b0a5ee6b6ba85ULL,
+ 0x70357a8a3dc47bdcULL, 0xb87d3786f8829f54ULL, 0x9977f1ab3318164eULL, 0x1fc1b51a3fdd51a7ULL,
+ 0xb62c51a53ad7fd04ULL, 0x87d9f89ae0fa42bbULL, 0x210895f57518d7e2ULL, 0xc31590bed8826191ULL,
+ 0xc432b6100c9802beULL, 0x6269c388fb904363ULL, 0x12088d69695a664fULL, 0x6d9859623ce4d74eULL,
+ 0xf9d6789b6035085cULL, 0x85dd72540ff086dcULL, 0x3746121977567a06ULL, 0x10ce16d814654dedULL,
+ 0x77798e53d3d404b1ULL, 0xb3bd8f77f7aee60dULL, 0xb75192497c1a3827ULL, 0x7baf6aae9f62cfe1ULL,
+ 0xb56cdeef6bdb482eULL, 0xd2c1738110a12e46ULL, 0x1a263bd4380729bdULL, 0xed8871732ca51a07ULL,
+ 0xd55b55315a34c8faULL, 0xf1e8b7792dfd5b3ULL, 0x1c98e9e06117ca06ULL, 0x16114f9c3212e8c3ULL,
+ 0xee7a88835a7960e6ULL, 0x2baea6ff694df672ULL, 0x3be23d560e034a91ULL, 0x819e458c2bd68a9ULL,
+ 0x38f5aa05142da52cULL, 0x414422b23a1cbae9ULL, 0x48c14d1b408134faULL, 0x85a7c7cb1d9bb05ULL,
+ 0xf59dc046db30d83fULL, 0x4a18ea0e5e8cd03dULL, 0xa422129c9b72b01dULL, 0xa6dc667c80adc400ULL,
+ 0x7e26457be7f18682ULL, 0x9774b564eb730bf8ULL, 0xc8dfe710cb6a0dc6ULL, 0xa10bafb180ecc335ULL,
+ 0x20f3cc3553a17ce5ULL, 0x5b6c778fcfeaaddeULL, 0x79f29dd58dd055f2ULL, 0x2ada0d63a0c645acULL,
+ 0x16c3766965cabb69ULL, 0x4f19cd705157554aULL, 0x77e414e1872a80e8ULL, 0xf9452bfa121d3dfdULL,
+ 0x623cc678714cdea3ULL, 0xe6d768719ae2f108ULL, 0xd6bfb9ec7a0b6747ULL, 0xe5e56841de5450c0ULL,
+ 0x24cd0b9b8abdb0e5ULL, 0x33a89563b318ea10ULL, 0xdea10e775e040f92ULL, 0xf269220cdb83c07eULL,
+ 0x3db279c1ec954eedULL, 0x9229374fa7638e47ULL, 0xe44b78deacdc89beULL, 0xb1fba819e0d8250eULL,
+ 0x32c55f7da9a2e18bULL, 0x3e6b7f4e68931f36ULL, 0x929f7c8c27c27001ULL, 0x2e8f45aeb4ea4ddaULL,
+ 0x684ad8ee8cbae163ULL, 0x4f23cc7d6766b42eULL, 0xd46d1b25b075a4acULL, 0x8b32932272d68785ULL,
+ 0xf9291a111102df25ULL, 0x8cc2e8f1ce09b9b1ULL, 0xee77334cfbf36911ULL, 0xa12a0106db73c025ULL,
+ 0x5c25a2fbdde97cb5ULL, 0x35db98d4265df0a2ULL, 0x11b3748598770f18ULL, 0xff95de830ccde47bULL,
+ 0x15040d4b0e4ed124ULL, 0x31706c58fb47fff8ULL, 0x1bf581bc2042ec06ULL, 0x2b6514715b7ffb72ULL,
+ 0x11928e285b91f116ULL, 0x50051b19a25f0872ULL, 0xe6c1513bc7f4cd43ULL, 0xd749f8cea050091aULL,
+ 0xc2fb8211d84065bfULL, 0x1a51b73367ecfee2ULL, 0x3a38672fb700f17cULL, 0x6962eb833c5385cbULL,
+ 0xbde1a94fcdf8d1c2ULL, 0x7680c89a96b203c6ULL, 0x9b6eea306adb90c4ULL, 0xe3f09d85b50ce8a1ULL,
+ 0x84a6ee3d38aedf77ULL, 0x8328a936b71e47a7ULL, 0xdd8059752be46c4bULL, 0x2535cb4fc43827e3ULL,
+ 0xdcfe238443c9af75ULL, 0x18f9b97e01e7c780ULL, 0xf4eb56ce9fb0fedfULL, 0xe77de0ce261c43b0ULL,
+ 0x94ff9d026a46566ULL, 0x87ab693b9d5e83e0ULL, 0x114cb018624bba70ULL, 0xedd055ceda1aefdbULL,
+ 0x4e1c1bb4917210b0ULL, 0xce637d25a819c7cbULL, 0x9ffb194dc57d9446ULL, 0xbdea66db70a15502ULL,
+ 0x8a5f0a2264090148ULL, 0x6f3167cae3af318dULL, 0xa975a1267cde608cULL, 0x9529d910fd7c988fULL,
+ 0x82db75a778d465aaULL, 0x74af85c19ee32b66ULL, 0x9c2678d9c86478f6ULL, 0xeb611185db04b0deULL,
+ 0xee786fd92240aa60ULL, 0x88d018a2b3331c98ULL, 0x729deedbf27f67bcULL, 0x9406d9a1d8285584ULL,
+ 0x6cf303780d1f13f0ULL, 0x465ec41f355139cbULL, 0xdc8042276da797cdULL, 0xeaa363fc626d1e0dULL,
+ 0xcb8725889fec93c3ULL, 0xd3139e359d8471eaULL, 0xc6b3f34b5cefb304ULL, 0x37566f98977fa18fULL,
+ 0x4534002b4681d374ULL, 0xbac7e33edffcc399ULL, 0x8fc28c8167f83f73ULL, 0x64c976207f329083ULL,
+ 0x7befeb4339d1ca0cULL, 0x741668ff5bffe2edULL, 0x6be7ac88ad64e2c4ULL, 0x519b76971879b398ULL,
+ 0xe88b67615b78d04aULL, 0x8cd85f8f37702f14ULL, 0x85c7d50dc6cc8728ULL, 0x921e24728bcba949ULL,
+ 0xb9afb3dd8ee5a4aeULL, 0x2c7c2b362d14fb19ULL, 0x99fa0775849be4aeULL, 0xd59a541705b89af4ULL,
+ 0x573065682096b8c7ULL, 0xf737538af51cdb99ULL, 0xfc6fb44d98d14a3bULL, 0x21fe77b0e0da39e5ULL,
+ 0xda30b0ca5defc1a5ULL, 0x9d5b11e10fda2cbeULL, 0xd3ff9c402af9785dULL, 0x80745777800f0b48ULL,
+ 0x44a23e74a57f12abULL, 0xee74c403a904adceULL, 0x698352ea3170e90bULL, 0x5b8d15122878d734ULL,
+ 0xff38be84f18d5d8aULL, 0x254afeccb225def6ULL, 0x43f0087171e5f742ULL, 0xed311d9ed729efb6ULL,
+ 0xe76884251f27ccd7ULL, 0x292d87d43cf8dd8eULL, 0x63c146f2a514ac31ULL, 0xbd554524d52a361aULL,
+ 0xc3f2dd6f69ff6027ULL, 0xf78809abfd012ea7ULL, 0xdef82fc5e2d02612ULL, 0x36c6726b46069b02ULL,
+ 0xbabce5d183eb5a2fULL, 0x1d41a9ea806292b1ULL, 0x11d80ded5d6b5118ULL, 0x1b11143726636991ULL,
+ 0xa6596bf16f819729ULL, 0x73676989d5d6f2cbULL, 0x918110cf1d46869fULL, 0xd94b9fbe57b25597ULL,
+ 0x30905faa3e60f520ULL, 0xfb302cad772e730bULL, 0xeb5a83f072af4361ULL, 0x66397958de07777ULL,
+ 0x7c076900f5651985ULL, 0xcb60a49cf739a126ULL, 0xf9a5145cc64148c2ULL, 0xf54c28074c5c5570ULL,
+ 0x9abd3f99ca650f32ULL, 0x6a88a7fc4c9490ccULL, 0x7086deeda2743fc7ULL, 0x59ac835ab70402f3ULL,
+ 0xf49cf320d9a93238ULL, 0x686635c42e0a229dULL, 0x54d3bd65cf6a3ff3ULL, 0xae0977f493c730c3ULL,
+ 0x12e073a401731616ULL, 0x1da73ca5dd532797ULL, 0x5834ae02a45ed788ULL, 0xaad5423df19ac834ULL,
+ 0x4ebdabff424f99baULL, 0x4245e61982d91b1dULL, 0xe705c10f872a40dULL, 0x866f66220ef43df9ULL,
+ 0x993c85ae019de4a0ULL, 0x703918c13ea22d0ULL, 0xd4151c3b9ffad78ULL, 0x8b580766633d954fULL,
+ 0x23756e592af93c3eULL, 0xf9318f0cd4b9b12fULL, 0x4ec524c46a8e5e1bULL, 0x8b126daf58f46edbULL,
+ 0xf4764a0701cd63c0ULL, 0xb94d976dc4fa6039ULL, 0x1837257ebbd5f09dULL, 0x167149a40f128c7eULL,
+ 0x9a852863a6c617ffULL, 0x22f444c26f263f86ULL, 0x98fdcc2ac14f0441ULL, 0x8d850b3dab09c8fcULL,
+ 0xb13c0ec41395346dULL, 0xc93cfe1f33a1ac9ULL, 0x8919a996fd433856ULL, 0x36b2119c65c19d17ULL,
+ 0x80ec63362be57495ULL, 0x8944928aaefae7cbULL, 0x55af5eda3a0d71fULL, 0xe6332203445cf0e2ULL,
+ 0x800305f6894a78c5ULL, 0xa35f0873b2cdfe5cULL, 0xe93475a5f8727411ULL, 0xa9549993fcb921b2ULL,
+ 0x1479b8d1e968f1f4ULL, 0xea2202e44a70eb56ULL, 0xb955f098c90479bcULL, 0x885e89c041914d19ULL,
+ 0xa7099d72d261566cULL, 0x6bb9f826f2489c93ULL, 0x5e2ecf04ef56f2e6ULL, 0x4c2ee6edebda4a0aULL,
+ 0x520204be0a0d5b14ULL, 0xd2fb886f78314e8eULL, 0x44190b3f07e0aef6ULL, 0x6186843c013cd0b2ULL,
+ 0x80a6351062c313e4ULL, 0x69d01f7a27497aecULL, 0x84b80656fa670812ULL, 0xf090fd363a98c291ULL,
+ 0x7322c26936a74d5dULL, 0xec08c52c4b23d944ULL, 0xd0aae7f90c6194f8ULL, 0x7c309fa26bcc81f7ULL,
+ 0xcb28d0abeb7b4747ULL, 0xa7e838aeccc035b6ULL, 0x55b01c09c8765354ULL, 0xea123c52ef4f7f47ULL,
+ 0x64897f4a5b0c12c3ULL, 0xb4e88fbce8564131ULL, 0x59c315b1e67d941aULL, 0xdfbca66be4f61e9fULL,
+ 0x47258382b50c26aeULL, 0xec1f314aba51ab36ULL, 0x706ae95acdd0540ULL, 0xc3c2a86d7abf586cULL,
+ 0x816bb5ecb4c51ce7ULL, 0x4d9f8c86ce7bb516ULL, 0x67a65f67d91f45c0ULL, 0xb6e8b50a6ddff131ULL,
+ 0x5759043155e061a9ULL, 0xab063392ac666d83ULL, 0xd4e0f469af22d5a7ULL, 0xb82d2c6382f84c91ULL,
+ 0xa34392373d515583ULL, 0x7335ea604f7a27f6ULL, 0xc8b81ea29322ead7ULL, 0x8f791b9c0741797fULL,
+ 0x3dc0140befaf64f2ULL, 0x28e7dff76b084f13ULL, 0xf5555d5ae0140354ULL, 0xb8899c0c64c3a48bULL,
+ 0xfdde3d5417da392dULL, 0x2f0c1660369bf191ULL, 0x85f0296fcccfc40aULL, 0xe5162c3966c95f49ULL,
+ 0xf26947b16ed46ebULL, 0x769f2f4ce803d575ULL, 0xbca8569211434ab3ULL, 0x92f4f5e00e3a8ab9ULL,
+ 0x5c7c776eab6b0f95ULL, 0x520d21b4a87bf80eULL, 0xce476babc4be1d5fULL, 0x5e2237f4bbc30c8bULL,
+ 0x6aff6da6cd295a16ULL, 0x376d70419dac6ed8ULL, 0xd6b538e9cc597c55ULL, 0x131696740ae5f1c6ULL,
+ 0xb31738e28ff7618cULL, 0x96a43e58a3c134acULL, 0xbaecf924f16a4edULL, 0xe8aeaa92b5b7f0c0ULL,
+ 0xb30de091033c2affULL, 0x2de23c903a5087cfULL, 0x287a24fb1867a9d6ULL, 0xa98fcfb8c3d533a4ULL,
+ 0xdbb81a89c7e7bf17ULL, 0x80ac3e802a40fbaaULL, 0xd39c79d96c6e1457ULL, 0x171b48c5bcdcd727ULL,
+ 0x50c761e0041a91d1ULL, 0x1a1e7014b7186edeULL, 0x36bf1a17b6013730ULL, 0xf79f73bfe63e1c40ULL,
+ 0x406f955337a5e6aaULL, 0x7d28e2a450eadc49ULL, 0xd33e3affbdcda33cULL, 0xcca3b91dc8841daULL,
+ 0xcf780ab12922b45cULL, 0xfa9b6383e6b35c1aULL, 0x71c9a39f280d77d4ULL, 0x4e8eeb55549ad991ULL,
+ 0x7054b83bf5ebb0c6ULL, 0x44869d0dbcc48253ULL, 0x67e993249222bc1cULL, 0x920d0766fc2dcd19ULL,
+ 0xa521a133891a9e3dULL, 0xd226827f57f59a10ULL, 0x6df92bc6079e508ULL, 0xf5b979b52d67d029ULL,
+ 0x13c9b3c10222bbaaULL, 0x36b0b51796d9b029ULL, 0xa4251ce8ce8864acULL, 0x24d61ab6b5b10acfULL,
+ 0xdf318d11b96474cdULL, 0xeb026f11f8f8b919ULL, 0x37257382b8307de6ULL, 0xd3a3c045e9a30520ULL,
+ 0x9f7ee28508ec551bULL, 0x5863b569cf669246ULL, 0xe5a77b49310b1f6cULL, 0xbe4af34d110816d5ULL,
+ 0xf9c087e7b2bafd4fULL, 0x34f34f081eac01e3ULL, 0x393846c9c03dab6aULL, 0x2212d20f4bbca3f3ULL,
+ 0xfb03b04f6376f698ULL, 0xabbcc6e64292cafaULL, 0x2124c6d3a77af9b5ULL, 0x263d0ca47693fad5ULL,
+ 0x192156d9aa0efd79ULL, 0x452bea1c465d508bULL, 0x8a9dbdcfa2855280ULL, 0xa9f89932b7fd1578ULL,
+ 0x701905681fbf430dULL, 0x8fcf33d0be8fcaf4ULL, 0xeda624a010ebc14bULL, 0xf381d393b73e8b20ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0xa2fb301684f1d6b9ULL, 0xbf6b9eb80b8af890ULL, 0xc68675ec94734b0eULL, 0x7d7a65b32cf01702ULL,
+ 0x4eb15766ad69076fULL, 0x372a6fe96e5a1e6fULL, 0xbb9b19bb92bed4ULL, 0x5c887ea2a8d727ffULL,
+ 0xf064240e81067402ULL, 0xdd1034d8a9ce0f4ULL, 0x6fa57c1269eb41dbULL, 0x1193c945133c9b0aULL,
+ 0xd5cce04411219e9eULL, 0xda04b15450730320ULL, 0xc6d6c7661deabc58ULL, 0x90a1619d451fcb66ULL,
+ 0xab254a71fe1b7136ULL, 0xfe1a4c4a3356df00ULL, 0xf86e0020e535ac2aULL, 0x6a0a71cf99a89ba7ULL,
+ 0x12bde6127c507dd1ULL, 0x25d6e1c1a8c3534dULL, 0x8f2ee5a118e4a7edULL, 0xd3bad8083a7be619ULL,
+ 0x31c681ef10320642ULL, 0x97c906cc8754463bULL, 0x1f6a11b53dc4c53aULL, 0xeb6117a1c3f787afULL,
+ 0x6d584aa32c028b33ULL, 0xe8a9b0e672f5ada4ULL, 0xa411cfc2cc0b0292ULL, 0x66de1d5d68a02615ULL,
+ 0xd4d49c1c19e5d052ULL, 0x395d8aaf041d3a57ULL, 0x55791080157ef88aULL, 0xa999bc82caf84eb9ULL,
+ 0xa69fbdaddcebffbaULL, 0x4f1818393d6d6accULL, 0x53c3fda476e0fb41ULL, 0x774b84c2977b8882ULL,
+ 0xfb1714f88f1a8822ULL, 0x8af5b37309b64ce7ULL, 0x375fa1c483347e04ULL, 0x5ae647a1f8be993eULL,
+ 0x273cdcaf7abe1803ULL, 0xbc95439052571baULL, 0x8c7aa7e6b4c270e6ULL, 0xae70a8a4801d9d30ULL,
+ 0xedc60851c1590d36ULL, 0xc1d06b2fd736aab1ULL, 0xe61f29e7e3f12442ULL, 0x667baa681fca6c5cULL,
+ 0x7fed5791d1936bf4ULL, 0x699cd762977ab69cULL, 0x4455d453d8fad37bULL, 0x10412c3174de1b09ULL,
+ 0xce9719367803fULL, 0x8308016598e3e798ULL, 0x9e266cd43ed0f02ULL, 0xd947f54df3c04bf2ULL,
+ 0xf6c9700b49399ddfULL, 0xe1febce61c4b0e68ULL, 0x5bb68975eaa851c4ULL, 0xd9ac8a1f5d01f9f3ULL,
+ 0x6775d19501a07a6cULL, 0xe35ada7579690aefULL, 0xc9813498a942233aULL, 0x5e5d5635f83e4477ULL,
+ 0x64f379d7e8031bcdULL, 0x59cc9c52066f417cULL, 0x9b4a7fa1d96e1b62ULL, 0x4c86b09b209104cULL,
+ 0x3bfc60aa41caf584ULL, 0x607cc878ca5e48d3ULL, 0xac426e2fb5bfc3f7ULL, 0x463952603b091c2eULL,
+ 0x4cd6b357ae40e0e2ULL, 0x9bc9b473e37c761aULL, 0xbb0f96b97a001660ULL, 0xd3bb64951c4025afULL,
+ 0x1362b136f4964f49ULL, 0xee6db3cdd81cd509ULL, 0x4fe7b6f83f973e74ULL, 0xec6f65ee1e1b5e31ULL,
+ 0x20736cc59fe92900ULL, 0x41a0946c4a724ce0ULL, 0x62d794c966dd3c75ULL, 0xdca232f740137162ULL,
+ 0xed4a609012bdead1ULL, 0xf3f71949532f683dULL, 0x3b552d21afed6f9ULL, 0x712c0785e2d3802dULL,
+ 0x113c7377f535b6bbULL, 0xb00ccbb5a1c5e3b6ULL, 0xd97bf376924221a6ULL, 0xf5966a9f9adab2d7ULL,
+ 0x6bb06a7d1837dc28ULL, 0xc505cabda03b441cULL, 0xeed3ed1ee4082e94ULL, 0xf45010c7a7d7ec69ULL,
+ 0x7be6d48bbc5a1721ULL, 0xa328c40ba41f499dULL, 0xd81af0d8c2a56cd9ULL, 0xe20135e85a7b360aULL,
+ 0xa525b6e6f21a0dc4ULL, 0x8c0ad575c4ba14b3ULL, 0xbe8000f71adf627fULL, 0xde21352ff0bc7e10ULL,
+ 0xe8435d6b47887d23ULL, 0x376ba1ac35e19331ULL, 0x393075b7b93620a0ULL, 0xd64233d9ff3ec161ULL,
+ 0x5794d62b3072419dULL, 0x5ee6a7cb60d0145cULL, 0x4e1713e3991ca01dULL, 0x4bb699622b35153eULL,
+ 0xebcdd8fe9a858630ULL, 0xb65882462886b4b5ULL, 0x805576b307ea8940ULL, 0xf8dbe0ae4d0e7446ULL,
+ 0x22b8a390fc83cdeaULL, 0xa2342cb0b5aa43d2ULL, 0x18107c1ab9b6a937ULL, 0x2a32765fbd49c655ULL,
+ 0x34929fd64c1b7524ULL, 0x6a4413e30c73943bULL, 0x7892bca15d61d43bULL, 0xaec15f30991d0d24ULL,
+ 0x36efb5016de44893ULL, 0xb250846132280f7ULL, 0x91aa72e2242d3dc1ULL, 0x95efc574fa9c1c7bULL,
+ 0x124b954530d0f066ULL, 0xa420a85f74c651baULL, 0x4649017131a9b2bcULL, 0x50de7be73d18f83eULL,
+ 0x29db87c71ee451d9ULL, 0x580f5fd1805a2bf7ULL, 0x41215eb281cf1e18ULL, 0x4e940fdd3f45c970ULL,
+ 0x9df10eef6a849a56ULL, 0x6ab27080eb88ab60ULL, 0xbe134ad7c5493a0ULL, 0x1f0fbf64853a723aULL,
+ 0xefa83869fe81cbb4ULL, 0x280e1fde3e2c964aULL, 0x4c9679c99aa2bb33ULL, 0x2f166e6f99a7f44cULL,
+ 0x16ccc45eddbc2e5aULL, 0x12ad2b5f5cb63bc7ULL, 0x2643f07bddfb748eULL, 0x169c77342e168236ULL,
+ 0x3a7b45bf39fcde64ULL, 0x7cb581de80c7d05fULL, 0x208e6c02d5eed1d9ULL, 0x338b107c4f54b284ULL,
+ 0x1c1bdfa8e64be10ULL, 0x6de1f3ff93cfd0bULL, 0x1c13637898c7c6a5ULL, 0xaf0b6b852d74621bULL,
+ 0x5b0e5b7a8d2baf55ULL, 0xa996843a8f921f32ULL, 0xe82d4141938cb8c3ULL, 0xc2aa0f8857fac73eULL,
+ 0x28366b989b3987c8ULL, 0xfc2c32d7a8e44707ULL, 0xa1af61b963baa1eaULL, 0xe8b8a292b468c174ULL,
+ 0x620777687b81fcacULL, 0x501d7b3b3945de3ULL, 0x9f969a45ab11934eULL, 0x2853e792ad22d5d2ULL,
+ 0xf5a3cbe7776c86b0ULL, 0x13104c09a2f4edb6ULL, 0x8ef2bcef827c7b56ULL, 0xc9c499d6547f92b7ULL,
+ 0xa7635d90947c7f7cULL, 0x7be96135b61df63ULL, 0xc48a6697700b08c2ULL, 0x53132a49954ff89fULL,
+ 0x18c1d9045490a618ULL, 0x2fe345886880d811ULL, 0xf9810661610d37bfULL, 0x4868eec7e3a0caedULL,
+ 0xd93697bb9628ddceULL, 0x4e1fec048bb0287ULL, 0x82a1fb7283edd9acULL, 0x12a70f6dfffb3b32ULL,
+ 0xfd82e6e34a082354ULL, 0x1cfb87e9d2fa38deULL, 0x68d5d10b6f14a9e5ULL, 0x9bcfb88ba65b54eULL,
+ 0xedaae51fe86d935aULL, 0xa19c089e41c41e43ULL, 0xea26ea6102909b74ULL, 0x45bc64ff8ee29358ULL,
+ 0x11102ce7366609b0ULL, 0xc0fbc148c36d99c6ULL, 0xf27253036ad53f30ULL, 0xfdd2e47bd91a452fULL,
+ 0xcac3ddd143d8c578ULL, 0xb49a2790a93e6a5bULL, 0x7d8a642fce888946ULL, 0x36cb9cb3fa6d3fb2ULL,
+ 0x17a7ae6d6642f93cULL, 0x10a1e3460f58ea97ULL, 0xf48a4967c5938eb8ULL, 0x1f9ce115b9710ac6ULL,
+ 0x2e3b14a6fdcabd4fULL, 0xa7944a55e2480794ULL, 0xd889b88d1665ccc9ULL, 0xf82f3f4d2896de52ULL,
+ 0x70754a54d9fed168ULL, 0x152704f83fc4554aULL, 0xec63cae7d823a1fULL, 0x24e5dc1c9ea6d577ULL,
+ 0x49c79700251b120ULL, 0x7f99d670a13a101dULL, 0x20b0e2a355242e62ULL, 0x4566b478b0e81440ULL,
+ 0xe1c31f733328bf14ULL, 0xc1f2ffff77bad7c2ULL, 0x8f8400b6cdc31c42ULL, 0x268bf934536003bfULL,
+ 0x7b91fd277a0e1ee5ULL, 0xb913b37e28c4b787ULL, 0x4c953a0d66817e31ULL, 0xb227c00a84860c4aULL,
+ 0xe4b0605db0e679fbULL, 0xbaa6f04326d2029aULL, 0x836ee1da85bbdf1fULL, 0xc9e22db345220764ULL,
+ 0xd74ec8e755807478ULL, 0x29808646cbc74532ULL, 0xd040c0d0191c0e60ULL, 0x22c3e6dcd1491a28ULL,
+ 0x8b9e1077a0bd7562ULL, 0x2058a420a8399ebaULL, 0x626d0145f35a3b81ULL, 0x1127301c31db7335ULL,
+ 0xdb1e55e5dc7a537dULL, 0xfc6318472b4234e4ULL, 0xe4a80cc761f4453cULL, 0x2e1325d2d5afbb31ULL,
+ 0xd9398bd883627a3dULL, 0xf6567d84787e7c26ULL, 0x709d19e27c7e398ULL, 0x68294f4bc83f6aeeULL,
+ 0x52acbf11435f9a61ULL, 0x2a37d2e6b1fb6e56ULL, 0x230dcee5cfa65a98ULL, 0xddf651603dd4f0acULL,
+ 0x75de87a64288cfb8ULL, 0x8e5415d908651934ULL, 0xaa9c33bb68bcfc73ULL, 0xf032770d2ccf12cfULL,
+ 0xd0781b1670d74202ULL, 0x5b88eb69d0a35ecULL, 0x4bec02113de149a3ULL, 0xc9089280a5be186aULL,
+ 0xd637182829296989ULL, 0x89a77d4747ae2068ULL, 0xe7503c058bbe2354ULL, 0xd89275a668e6966dULL,
+ 0x2260793c7582e453ULL, 0x60741d61c3d4fcaULL, 0x56098e87a0a1c8d4ULL, 0x50977dc8ae969e12ULL,
+ 0xe23e8202f5838bb3ULL, 0x82b3778c5b91648eULL, 0xf2a108fe92b9a478ULL, 0x7ce5b67ce327c0f6ULL,
+ 0x548c681d868d0847ULL, 0x2a9c649859474fb4ULL, 0x982583098036ddeeULL, 0x7c2348480fba0788ULL,
+ 0xcf489913dce3a00cULL, 0xcda4fe69372e9a1eULL, 0x7486177cc8954807ULL, 0x8da091e9e00d941aULL,
+ 0xacce6cf59fab9b38ULL, 0xe5430c86b54a074dULL, 0x594d87d4f3911ce5ULL, 0x3fbc9f4bb1f277c8ULL,
+ 0xf9c14c90b20728f1ULL, 0xa967fe5b436092fcULL, 0x5f80bec3cf3cfaeULL, 0x2b926ee2312ddbf9ULL,
+ 0xcda9d94cb72253ecULL, 0x2e79538857826f4aULL, 0xa8c2220820ad5068ULL, 0x2991c1f4cc68a0b1ULL,
+ 0x3b1d0b0c37912de5ULL, 0x33d8346eb769773bULL, 0x5dc351b16928834bULL, 0x64faffaf6afbe69ULL,
+ 0x73769de75af18b45ULL, 0x8f734115c9b44422ULL, 0xb9d932f826b5cc5dULL, 0xfd0e23c7125af091ULL,
+ 0x15b6526e5c073902ULL, 0xde5c15f435ae488aULL, 0x6bdad990730aee3eULL, 0xfac4ccaca8e8144ULL,
+ 0x41b88430fd4e7f8ULL, 0xcdf389d9ae758f99ULL, 0x3fbe26ff6308492aULL, 0xe3bde23f6f8f2ad8ULL,
+ 0x2750495d0dadd5eeULL, 0x60aaf98cc5e68ab7ULL, 0xe528b22e39e6dd6fULL, 0xc20cce673dd4920cULL,
+ 0xf45fc486658b34b1ULL, 0x8236a8ce25d0f4adULL, 0x4ef8016cdc74ea84ULL, 0xefce5f553bcdd92bULL,
+ 0x5ad292a7f577d810ULL, 0xd9e87f03f3fa382fULL, 0x919cb5db0d305a86ULL, 0x39021ca431e36c9aULL,
+ 0x73cee9fc7b9f70c2ULL, 0x7dc18ee74b039b00ULL, 0x4a0f2b10b5f1bcf4ULL, 0xb6ba396f2a63aa0aULL,
+ 0x1b5fdd24b87bec1aULL, 0x970e9d337f98a549ULL, 0x375a4fd74b9f804ULL, 0x6008f35faadc239aULL,
+ 0xff4db58c6198d86bULL, 0xbb1a982072a11149ULL, 0xce7b4b3aa420717aULL, 0xf43a3283bad202a1ULL,
+ 0x4c7fe6a57aba1c13ULL, 0x67f07a569d77ab46ULL, 0xc49bd563a67bb749ULL, 0x6ddb852c74094bbdULL,
+ 0x16e1f64969b38812ULL, 0x3ffc10423a446c77ULL, 0xa48bf502358cf4b1ULL, 0x3caf4cb1f9796f69ULL,
+ 0x287d5b8d7be9aecbULL, 0xb42a2a787d34daf6ULL, 0x141b50dcc7717a53ULL, 0x2f39ebc345b20dd6ULL,
+ 0xaf2d3a635b4a49fcULL, 0x9728938407b7095cULL, 0xc266fa26acad9169ULL, 0xa57e8a77305b98bcULL,
+ 0xa4fa207b79308268ULL, 0x36ebd34a741ea985ULL, 0x7fd76525dedc394ULL, 0x67173aa63ed42783ULL,
+ 0xc53d4fb0bb32d2fbULL, 0xeeb4f53220c1f8a7ULL, 0xd6a5995db122dcfeULL, 0x38e7f89f13cbfdbaULL,
+ 0x1bf6ccfcfad6d7b3ULL, 0xaf3dd3b0665c17f8ULL, 0x2d40e2a9ca50bb3cULL, 0xc29db14c351416b5ULL,
+ 0x18d17f8aae7a6e1bULL, 0xa43d0b0a8d171d4cULL, 0x1e86d121e03b3c5aULL, 0x708c7b8dbd1a52bcULL,
+ 0xdd3a473f5f8a8192ULL, 0xa80d9f21b9da8998ULL, 0x257a92eaa32e0f38ULL, 0x9f1e8d9f2261178eULL,
+ 0x6cc33e93b01b74d8ULL, 0x32b9ff80440565f1ULL, 0xeb26d3276d2018d5ULL, 0x82a5b921bba6c373ULL,
+ 0x722b4286cf75e256ULL, 0xf61b96dabb53398bULL, 0xd0be617490f87fa9ULL, 0x653a1ee14988a9eeULL,
+ 0x7dabe354848d4a64ULL, 0x3bfcb7d88d55cb5aULL, 0xd7e0a489d1593414ULL, 0x67329c6cb749ff7ULL,
+ 0xeefba4312c5a3a51ULL, 0xa6ddf9c02ca4ec1fULL, 0xdbd6c91ce75a3effULL, 0x39a3d1825c858dc6ULL,
+ 0xab6e1a8ae6f4c171ULL, 0xc9ff712905493e75ULL, 0x23f6321e1d0fc5abULL, 0x12a7d2cf8a957601ULL,
+ 0x58f13af4a4f5d5a7ULL, 0x5a6dcc762ae9b7a7ULL, 0x5c0a4e49cf2bbbe2ULL, 0x7a78e6840e398d70ULL,
+ 0x666b9cc505d0d4eaULL, 0x15ae9a20484a4c6bULL, 0xfda176a7f29082d3ULL, 0x23bab284be84f6daULL,
+ 0x1b610e17aafc131eULL, 0x825833f405a1cbe6ULL, 0xa2db803435ed7f2bULL, 0xc5e15c6f85bd816dULL,
+ 0xa7f64f82a6750095ULL, 0x2882d90cf53c419ULL, 0x19505847eba99e0fULL, 0xd02316e6db2830c7ULL,
+ 0xef0503a98b63be91ULL, 0x35dc89ae8158a2e6ULL, 0x55b858bcc1b00176ULL, 0x9a217bd75160660ULL,
+ 0xcdb84b814fabda9ULL, 0xf849613ae0d2dfc0ULL, 0x6a05bd115a044f53ULL, 0x9048cf751c7560aaULL,
+ 0x85366d85e4e9b94ULL, 0x9c85d5893ee17611ULL, 0x6b00dc988f3fa44dULL, 0x5dea062b516ea07eULL,
+ 0xca604bf8bb817671ULL, 0x4ad33f109ffde149ULL, 0x70988b1efd9bbb10ULL, 0x35e79cae93cd8b3bULL,
+ 0x75aab0671b1ec066ULL, 0x32dcfd00966ab3dULL, 0x24e367165128f15bULL, 0x96578b8d543d0b3eULL,
+ 0xdf76e3457117e577ULL, 0x240c560b343ab845ULL, 0xeb75aec665ab407eULL, 0xb719c8902adc24fULL,
+ 0x3995e75d8ed773e1ULL, 0x23bf8a4f2105e2eULL, 0x6ca5fed41cefccdULL, 0xb250cf7ef9cabeb0ULL,
+ 0x50463ed5a1d3972ULL, 0xcadf972029e9b9bULL, 0xa4d4808c16abd3eaULL, 0x2d418892a2bea6b7ULL,
+ 0xd37fd64a594a0883ULL, 0xae4fa7d06c287839ULL, 0x5a29f762a663fb57ULL, 0xd9cb60abd5129174ULL,
+ 0x71f975750a7b7360ULL, 0x72041c6f601d8552ULL, 0xcb8b26cc9cdf88cfULL, 0x912a8e24155811f3ULL,
+ 0x9d2fda3c07c3b65aULL, 0xdc7561c38a7c4ae9ULL, 0xb18c60f62d9e31abULL, 0x4ad191948f6ae080ULL,
+ 0x57968cf89b01586cULL, 0xaa8811a68d735c7aULL, 0x167ba8ca2e1ed2e4ULL, 0x151a49af84a9693eULL,
+ 0xf369d4fcf5ce2456ULL, 0x1d7aaa39b733445eULL, 0x2a89aad285e876d2ULL, 0x398b14f70cc102ddULL,
+ 0xdbad68f34f7c4f2eULL, 0xbea100f16aee4b14ULL, 0xbb2359eee98c7e57ULL, 0xa95b051515c8f8f8ULL,
+ 0xce3c15cef9969415ULL, 0xab73c5f08685ba80ULL, 0xab2f0174017ec044ULL, 0xbdbbe145c1665b5fULL,
+ 0x63a2313a575c2ba0ULL, 0x3b7c2461391419aULL, 0xf966cbfe40a2976aULL, 0x560dd4d1f1057e80ULL,
+ 0x5d25fd5f9b16e7f3ULL, 0xf7879d892df08e9eULL, 0x2aa8a60886db39e9ULL, 0x3ce23adf682303bcULL,
+ 0xc4cbadc94eaf1c22ULL, 0x87a904b3c7d28272ULL, 0xc105839d5587eb55ULL, 0xfa476cfbf34e4e5eULL,
+ 0xab0d465749c189fdULL, 0x10ace78fe20f500ULL, 0xd7fe6d818e98d07cULL, 0x62f2737619e90bf6ULL,
+ 0x107a7a9fd41dc4ecULL, 0x36c507920bc79efbULL, 0xb24c3a3867b31b42ULL, 0x92c644ba04f2ea97ULL,
+ 0x29f05a39ca7f8597ULL, 0x3658360c119fd99aULL, 0x1bedd19038544949ULL, 0xf88810481b089b45ULL,
+ 0x84733695f36d613eULL, 0xea32a1d3d0e7e60eULL, 0xf018be159d0f11c4ULL, 0x13b8a8dff6986253ULL,
+ 0xcd6c55a3a3954601ULL, 0x625efc8b44a2de4ULL, 0xeefef48f812459e5ULL, 0x58f07f5851299ecfULL,
+ 0x4f1ab7253d5a74dfULL, 0x91d418aed9cf0a3eULL, 0xea45c484c2f4d52bULL, 0x6bb51dbbf15384aaULL,
+ 0xc2081d2422753b51ULL, 0xfca3e2e2f3beada6ULL, 0x5ab1f1431cd6ca20ULL, 0x1c40a0a34c73315aULL,
+};
+#endif
diff --git a/lib/nettle/gost/ecc-gost256cpa.c b/lib/nettle/gost/ecc-gost256cpa.c
new file mode 100644
index 0000000000..6f891b087f
--- /dev/null
+++ b/lib/nettle/gost/ecc-gost256cpa.c
@@ -0,0 +1,132 @@
+/* ecc-gost256cpa.c
+
+ Compile time constant (but machine dependent) tables.
+
+ Copyright (C) 2013, 2014 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include <nettle/ecc.h>
+#include "ecc-internal.h"
+#include "ecc-gost-curve.h"
+
+#define USE_REDC (ECC_REDC_SIZE != 0)
+
+#if GMP_NUMB_BITS == 32
+#include "ecc-gost256cpa-32.h"
+#elif GMP_NUMB_BITS == 64
+#include "ecc-gost256cpa-64.h"
+#else
+#error unsupported configuration
+#endif
+
+#if ECC_REDC_SIZE > 0
+# define ecc_256_redc ecc_pp1_redc
+#elif ECC_REDC_SIZE == 0
+# define ecc_256_redc NULL
+#else
+# error Configuration error
+#endif
+
+#define ecc_256_modp ecc_mod
+#define ecc_256_modq ecc_mod
+
+static const struct ecc_curve _gnutls_gost_256cpa =
+{
+ {
+ 256,
+ ECC_LIMB_SIZE,
+ ECC_BMODP_SIZE,
+ ECC_REDC_SIZE,
+ ECC_MOD_INV_ITCH (ECC_LIMB_SIZE),
+ 0,
+
+ ecc_p,
+ ecc_Bmodp,
+ ecc_Bmodp_shifted,
+ ecc_redc_ppm1,
+
+ ecc_pp1h,
+ ecc_256_modp,
+ USE_REDC ? ecc_256_redc : ecc_256_modp,
+ ecc_mod_inv,
+ NULL,
+ },
+ {
+ 256,
+ ECC_LIMB_SIZE,
+ ECC_BMODQ_SIZE,
+ 0,
+ ECC_MOD_INV_ITCH (ECC_LIMB_SIZE),
+ 0,
+
+ ecc_q,
+ ecc_Bmodq,
+ ecc_Bmodq_shifted,
+ NULL,
+ ecc_qp1h,
+
+ ecc_256_modq,
+ ecc_256_modq,
+ ecc_mod_inv,
+ NULL,
+ },
+
+ USE_REDC,
+ ECC_PIPPENGER_K,
+ ECC_PIPPENGER_C,
+
+ ECC_ADD_JJJ_ITCH (ECC_LIMB_SIZE),
+ ECC_MUL_A_ITCH (ECC_LIMB_SIZE),
+ ECC_MUL_G_ITCH (ECC_LIMB_SIZE),
+ ECC_J_TO_A_ITCH (ECC_LIMB_SIZE),
+
+ ecc_add_jjj,
+ ecc_mul_a,
+ ecc_mul_g,
+ ecc_j_to_a,
+
+ ecc_b,
+ ecc_g,
+ NULL,
+ ecc_unit,
+ ecc_table
+};
+
+const struct ecc_curve *nettle_get_gost_256cpa(void)
+{
+ return &_gnutls_gost_256cpa;
+}
diff --git a/lib/nettle/gost/ecc-gost512a-32.h b/lib/nettle/gost/ecc-gost512a-32.h
new file mode 100644
index 0000000000..59e09230cb
--- /dev/null
+++ b/lib/nettle/gost/ecc-gost512a-32.h
@@ -0,0 +1,1081 @@
+/* For NULL. */
+#include <stddef.h>
+#define ECC_LIMB_SIZE 16
+#define ECC_PIPPENGER_K 43
+#define ECC_PIPPENGER_C 6
+static const mp_limb_t ecc_p[16] = {
+ 0xfffffdc7UL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL,
+ 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL,
+};
+static const mp_limb_t ecc_b[16] = {
+ 0x5a71c760UL, 0x50319078UL, 0xebee4761UL, 0x862ef9d4UL, 0x10da90ddUL, 0x4cb45740UL, 0xf30d2761UL, 0xee3cb090UL,
+ 0xfd0b6265UL, 0x79bd081cUL, 0x761cb0e8UL, 0x34b82574UL, 0x6667f1daUL, 0xc1bd0b2bUL, 0xedfc86ddUL, 0xe8c2505dUL,
+};
+static const mp_limb_t ecc_q[16] = {
+ 0x1f10b275UL, 0xcacdb141UL, 0xfad2b85dUL, 0x9b4b38abUL, 0x4e056060UL, 0x6ff22b8dUL, 0xf48d8911UL, 0x27e69532UL,
+ 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL,
+};
+static const mp_limb_t ecc_g[32] = {
+ 0x3UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x5215f2a4UL, 0x89a589cbUL, 0xc235f5b8UL, 0x8028fe5fUL, 0xe3a41e9UL, 0x3d75e6a5UL, 0x4fd036e9UL, 0xdf1626beUL,
+ 0xcbefa921UL, 0x778064fdUL, 0xacf1abc1UL, 0xce5e1c93UL, 0xe25450e6UL, 0xa61b8816UL, 0x7a836ae3UL, 0x7503cfe8UL,
+};
+static const mp_limb_t ecc_Bmodp[16] = {
+ 0x239UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+};
+#define ECC_BMODP_SIZE 1
+static const mp_limb_t ecc_Bmodq[16] = {
+ 0xe0ef4d8bUL, 0x35324ebeUL, 0x52d47a2UL, 0x64b4c754UL, 0xb1fa9f9fUL, 0x900dd472UL, 0xb7276eeUL, 0xd8196acdUL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+};
+#define ECC_BMODQ_SIZE 8
+#define ecc_Bmodp_shifted ecc_Bmodp
+#define ecc_Bmodq_shifted ecc_Bmodq
+static const mp_limb_t ecc_pp1h[16] = {
+ 0xfffffee4UL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL,
+ 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0x7fffffffUL,
+};
+static const mp_limb_t ecc_qp1h[16] = {
+ 0x8f88593bUL, 0xe566d8a0UL, 0xfd695c2eUL, 0x4da59c55UL, 0xa702b030UL, 0xb7f915c6UL, 0x7a46c488UL, 0x93f34a99UL,
+ 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0xffffffffUL, 0x7fffffffUL,
+};
+#define ecc_redc_ppm1 NULL
+#define ECC_REDC_SIZE 0
+#if USE_REDC
+#define ecc_unit ecc_Bmodp
+static const mp_limb_t ecc_table[4096] = {
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x6abUL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x72ca9068UL, 0xf0ef44e9UL, 0xa9ef2729UL, 0xdb1d62d6UL, 0x9f7c7ffdUL, 0x9b0da4dcUL, 0x65ca0c69UL, 0xd83c1cffUL,
+ 0x47aeec48UL, 0x9c60781aUL, 0x6526c102UL, 0xaf2d843bUL, 0xd67d100UL, 0x33317addUL, 0x4e1893fcUL, 0x15791bb8UL,
+ 0xd223389aUL, 0xce2680c9UL, 0xd5d1e9d0UL, 0x125b2f67UL, 0x32a49ab1UL, 0x228c4292UL, 0xbec9d296UL, 0xc03135b7UL,
+ 0x1870b908UL, 0xc7339576UL, 0xaa5d2de2UL, 0x76145f11UL, 0xa152f4faUL, 0x65f4bb32UL, 0x14f5610cUL, 0xb454b08eUL,
+ 0x4637f438UL, 0x4a102a1bUL, 0xec614523UL, 0xdfe518e3UL, 0xf04ff681UL, 0x2c7cc07fUL, 0xc043a693UL, 0x9d29613bUL,
+ 0x73f413a1UL, 0x71b20d19UL, 0xa52606e7UL, 0xb60dfc63UL, 0xf89a4bf8UL, 0x7eab6739UL, 0x7540d3cUL, 0x47155991UL,
+ 0x7d24d20cUL, 0x3f6087c5UL, 0x8f70275dUL, 0x46e6737dUL, 0x1ff30d56UL, 0x571f2483UL, 0x6c0c4db4UL, 0x11fb7529UL,
+ 0xdb1c5b98UL, 0xfe3dd212UL, 0x8b2f7ccaUL, 0x7bb916b3UL, 0x609ed33UL, 0x289ce20eUL, 0xf23f75a7UL, 0x8907864cUL,
+ 0x5da2e6caUL, 0x664a334bUL, 0xc6a8a8ccUL, 0xf05f1834UL, 0x46bea417UL, 0x5ca791d8UL, 0xe84ad0f6UL, 0x2a10a0e2UL,
+ 0x2cea5bd6UL, 0xb805f62UL, 0x2ac037f2UL, 0xb0749e4cUL, 0x624fc44eUL, 0x75ae692eUL, 0x2f13e26aUL, 0x4d2f8bd0UL,
+ 0x63b9386eUL, 0x7fa85704UL, 0xb4099b03UL, 0x11437d3dUL, 0xbe442243UL, 0xf0a8bf16UL, 0xa8b4c79UL, 0xd7965ffdUL,
+ 0x636d8999UL, 0x36329380UL, 0xaa77b4f6UL, 0xdd1afdbdUL, 0xbd151bf6UL, 0x7690f24UL, 0x3359a5efUL, 0x4f866b41UL,
+ 0x78703a24UL, 0xeeee87d3UL, 0xac3019d7UL, 0x4ca29595UL, 0xe9b4a393UL, 0x4bdbc8e3UL, 0xffd88dUL, 0xa057ff5cUL,
+ 0xd011f832UL, 0x5d4af522UL, 0x7a84bcb2UL, 0x43fd96b4UL, 0x85806046UL, 0x6ba58566UL, 0x171c1296UL, 0x98db4219UL,
+ 0xfa639733UL, 0x664651e1UL, 0xf8b40254UL, 0x4574c9fcUL, 0x699919abUL, 0xd90a2ca1UL, 0xabdb9006UL, 0x5907107UL,
+ 0xcbe4bf8bUL, 0xedf770c2UL, 0x6628fd59UL, 0x26a88df1UL, 0x4d851ab1UL, 0xb882cd68UL, 0xd1b11fb0UL, 0xb9d73089UL,
+ 0x6d2fc8e5UL, 0xd0cc4298UL, 0xbd074474UL, 0x2f404294UL, 0x56bd19ccUL, 0x1750ffc8UL, 0xae95ef0dUL, 0x159365b5UL,
+ 0xa90b8412UL, 0xb58ef30bUL, 0xcbaa659cUL, 0xb795e8b3UL, 0xebc67a56UL, 0x9d328685UL, 0x7c61386aUL, 0xda1d5fdUL,
+ 0x292fb325UL, 0xc035d406UL, 0x8a0a7214UL, 0x66de957UL, 0x2b8fc645UL, 0x47b4f920UL, 0xb0b0c81dUL, 0x9de80ce6UL,
+ 0x911dd128UL, 0xc3ad2e44UL, 0x5461038eUL, 0x90404215UL, 0x919a6b5aUL, 0x9313cbd7UL, 0x921e458fUL, 0x607ef8cfUL,
+ 0x88ebcf16UL, 0x4c14515fUL, 0xc4841917UL, 0xeb267031UL, 0x2ee929cUL, 0x9cdef61aUL, 0x4996cb6aUL, 0x882a230eUL,
+ 0x93005d94UL, 0x14f6d6dcUL, 0x290d32daUL, 0xadb1d1f5UL, 0x4433c687UL, 0xb7aaaf58UL, 0x2e6ac53cUL, 0xe3991b87UL,
+ 0x17d24834UL, 0xf9146cfcUL, 0xf6f69ac3UL, 0x9d9cd934UL, 0x26bdeff9UL, 0x43204744UL, 0xd048be62UL, 0xcdb64facUL,
+ 0xb9ace05dUL, 0x4a363ee7UL, 0x61415a4cUL, 0x2e079ab4UL, 0x75917c1cUL, 0xfca596e0UL, 0x78734728UL, 0xe9784baeUL,
+ 0xeaeff14bUL, 0x96ce429UL, 0xc8a7b322UL, 0xa972e168UL, 0x923451e8UL, 0xc285c93cUL, 0xb66944aaUL, 0x3590c485UL,
+ 0xfc3d4aa2UL, 0xd7b629f4UL, 0xdbbab620UL, 0x38574cceUL, 0xb92e3d39UL, 0xb06fbe79UL, 0x1059c1d8UL, 0xf1b32c6UL,
+ 0xbf17180eUL, 0x1be78415UL, 0x501d3cd6UL, 0xef85f41cUL, 0x2364e1e5UL, 0x46702641UL, 0xb6ba5a2dUL, 0x46478d6aUL,
+ 0xc651137UL, 0xd83bb3e8UL, 0xe3f06d73UL, 0x892df4fbUL, 0x786767d2UL, 0x52a8b39bUL, 0xbc3e9efaUL, 0xd577ae8bUL,
+ 0xfd64d57cUL, 0x49dc02ccUL, 0xb5acaf61UL, 0x9586c36dUL, 0x53746a1eUL, 0x109d245fUL, 0xcfb4ed62UL, 0x4d470330UL,
+ 0x932552feUL, 0x63476850UL, 0x9619e657UL, 0x30e67610UL, 0x41d70512UL, 0x9926e356UL, 0x5d9c43b5UL, 0xc8bee52bUL,
+ 0xff6a229bUL, 0xadd59735UL, 0x1e665729UL, 0xaef8edebUL, 0x92817004UL, 0x1619e1e9UL, 0x9204f573UL, 0x5eb66bUL,
+ 0xb4d11f6cUL, 0xb9a35769UL, 0x2510b482UL, 0x18ef8100UL, 0xcc0a7786UL, 0xeeb87b6UL, 0x5674d0dbUL, 0xba93b4a3UL,
+ 0x6280a02UL, 0x5a12f402UL, 0x4c7ebc9aUL, 0x96aa424UL, 0x30d6b43aUL, 0x32c93e3dUL, 0xf9e72f0cUL, 0xc216b2ddUL,
+ 0x3dab723UL, 0x3612e43eUL, 0x220ab512UL, 0x8abbcbc8UL, 0x52c9a6f2UL, 0xd263ee4fUL, 0x8cffa90eUL, 0xc3905b0eUL,
+ 0x1550f5caUL, 0x51aea7a9UL, 0x70947604UL, 0xeede5498UL, 0x7487dbe9UL, 0xccba462cUL, 0x831d9d78UL, 0xa302b46UL,
+ 0x8d41d4ccUL, 0x119ec69fUL, 0xdce5682cUL, 0x91e36fc6UL, 0x2e0ee654UL, 0xdc3cc779UL, 0xe4f90517UL, 0xf8c13c54UL,
+ 0x85e33173UL, 0x78b9dd4fUL, 0xb31058dUL, 0xb2ea3baaUL, 0x834a0e40UL, 0xaa5396a1UL, 0x17a1c947UL, 0xa288499dUL,
+ 0xa59145d6UL, 0xeb93d8abUL, 0xf0a3bf62UL, 0x1813c80bUL, 0x486a9c3fUL, 0x2e6bf178UL, 0x6d3a8b43UL, 0x16cd7c39UL,
+ 0xfe302efbUL, 0x71c23d8aUL, 0x7f1664a9UL, 0x731975d0UL, 0x54fdf5a6UL, 0x240aee4fUL, 0xb45840a7UL, 0x16fe9d59UL,
+ 0x1aed4487UL, 0x5fc6b7bcUL, 0x33cedd3dUL, 0x774d3fb9UL, 0xff0d5142UL, 0xf14802abUL, 0x3bf73de8UL, 0xce5e83e3UL,
+ 0x373f4d1UL, 0x9cfe2e9cUL, 0x5a7ef969UL, 0x63565e0cUL, 0x126036d7UL, 0xeb247599UL, 0x1b308d7cUL, 0xdcf35446UL,
+ 0x95e5f6f6UL, 0xb31c8af1UL, 0x2b861344UL, 0xca8a1754UL, 0x38e6224cUL, 0x777ee117UL, 0xdba9a8c7UL, 0xd44fb7a7UL,
+ 0x2cc1d335UL, 0x2364fa8fUL, 0x6705ffd4UL, 0x7cd7c5c3UL, 0x7b8503UL, 0xab858a7fUL, 0x966a61abUL, 0x643a88cdUL,
+ 0x70525a98UL, 0x922c2e22UL, 0x22ee34e0UL, 0x350c3bd7UL, 0xfd2783d4UL, 0x279a3d08UL, 0x39da21adUL, 0x51f1fabcUL,
+ 0xae9cf0adUL, 0xccc01a76UL, 0x7c2181a0UL, 0xd4b7d6dbUL, 0x96781901UL, 0x6e775acdUL, 0xc3433633UL, 0x3feac335UL,
+ 0x27fb62f3UL, 0x9924d29aUL, 0x9027b884UL, 0xb40e8b7aUL, 0xc431f2adUL, 0xd0d525f1UL, 0x45557e83UL, 0xb461a9cdUL,
+ 0x91f6ef75UL, 0x6df5e49aUL, 0x21ba1a31UL, 0xf4151c14UL, 0x150b64e0UL, 0x40d106a9UL, 0xd6e56e9dUL, 0xd40c0e04UL,
+ 0x32c3400bUL, 0xa0f345e7UL, 0x66d01a49UL, 0x4fb64f0aUL, 0xde0a33eUL, 0x797ca446UL, 0x876350d0UL, 0x18c384a1UL,
+ 0x760c3379UL, 0xb3db43adUL, 0xea1a9a1dUL, 0x13d31a78UL, 0xf28b6ebUL, 0xea28c97eUL, 0x7b8e4ce2UL, 0x2c6d93fdUL,
+ 0x9aa97c66UL, 0x56614cf2UL, 0x1aca1953UL, 0xffe9dd15UL, 0x43a914bdUL, 0xeed7e154UL, 0x45597ef7UL, 0x7bf2a09aUL,
+ 0x2895ee9UL, 0xec7b417bUL, 0x5272641UL, 0x8de8e712UL, 0x7641f0afUL, 0x8af93663UL, 0xf305ae8dUL, 0x89c40936UL,
+ 0xeaef3ddaUL, 0xf91d8f7cUL, 0xa5268af0UL, 0xd7b45be5UL, 0x4cecadc1UL, 0xb71dbc3cUL, 0xdb214874UL, 0xe9ddc69aUL,
+ 0x96f2bec4UL, 0x760671beUL, 0xca182ebdUL, 0x8a6b99ffUL, 0xc22467c0UL, 0x1d1b288fUL, 0xc70feafeUL, 0x5d5aa95dUL,
+ 0xc3426b01UL, 0x62963fa0UL, 0x4a624582UL, 0xaea3146eUL, 0x8b07ac88UL, 0xdbd3fbacUL, 0x96152649UL, 0x9a53967cUL,
+ 0x818c1eeUL, 0x32cae4c5UL, 0x68a3f242UL, 0x21db106aUL, 0xbd038aeeUL, 0xec3f70fdUL, 0xd9a037e0UL, 0xe6ce6fa5UL,
+ 0x4f6d503aUL, 0xfceb07aUL, 0x22af0362UL, 0xfe60ce4bUL, 0x2d2e29d4UL, 0xac41f688UL, 0x7a124035UL, 0x5646bb8fUL,
+ 0xa4b1e02aUL, 0x963d407aUL, 0xddcfa8d7UL, 0x615985a9UL, 0xdf383992UL, 0x1ee654f7UL, 0x70d50990UL, 0x6e694f39UL,
+ 0x24cd5b9dUL, 0x257a58f2UL, 0x168d84fdUL, 0x77527f38UL, 0x3cce3223UL, 0xfd4651dbUL, 0x3b361bbcUL, 0xfd61362fUL,
+ 0xa75ac3a2UL, 0xf39b499aUL, 0xab73e847UL, 0x53a5039aUL, 0xbdd86d81UL, 0xd20855acUL, 0x1555653UL, 0x62af10fdUL,
+ 0x7042b877UL, 0x821be712UL, 0xe69a1721UL, 0x22846b63UL, 0xb5b4bf4cUL, 0x7a2e13acUL, 0x6f2dfb1cUL, 0x31c76d86UL,
+ 0x72f68da8UL, 0xe1c52917UL, 0x5d13891cUL, 0xb5777b87UL, 0xb5aabe41UL, 0x4bd900dUL, 0xf498cef9UL, 0x7213a92cUL,
+ 0x59deb36UL, 0x4cab2844UL, 0x50c4aca8UL, 0xb1637390UL, 0x98f71f7aUL, 0xae3bca89UL, 0x61a6cd48UL, 0xc82fc774UL,
+ 0xbeed6141UL, 0xcca16937UL, 0x474a63f1UL, 0x5e29d790UL, 0x6968a75cUL, 0x1fd9cb6bUL, 0xddda28deUL, 0xdcfc5c37UL,
+ 0x591833e0UL, 0x59a319beUL, 0x443d3d81UL, 0x80b62464UL, 0xec9ac8a3UL, 0xa275a49UL, 0x2c2c57cUL, 0xe481651UL,
+ 0x1974ebb3UL, 0xb461c2c9UL, 0x80d82600UL, 0xae43e326UL, 0xdc2be4d7UL, 0xbc8e6957UL, 0xf5f2efa8UL, 0x2c7aec91UL,
+ 0xa0867131UL, 0x1272f6ddUL, 0x61e64d48UL, 0x2b696a7bUL, 0x409bad97UL, 0x62b85daeUL, 0x4cc94e9fUL, 0x88673ef7UL,
+ 0xa7d75892UL, 0xfe5b61d6UL, 0x3be27950UL, 0xc937c00fUL, 0x20dfc17UL, 0x7d363bd4UL, 0x33016116UL, 0xf9c03ba6UL,
+ 0x7955cb6UL, 0x71e5e67eUL, 0x233ae2ceUL, 0xe7129e0eUL, 0x1c5bdd7UL, 0xed04d303UL, 0xd6eebf80UL, 0x2bcbaa51UL,
+ 0xce9df96UL, 0xdbce333dUL, 0x3c7732c7UL, 0x6099a92aUL, 0x620e7ba6UL, 0xc9b96693UL, 0x7876847aUL, 0xf037af2fUL,
+ 0x913911ecUL, 0xe137a1dbUL, 0xe822c541UL, 0x5f66aa33UL, 0x12f570b1UL, 0xbe17f505UL, 0xefcec638UL, 0x54669d4bUL,
+ 0xf3fee5b9UL, 0xace24fe8UL, 0x8efbd17dUL, 0x93b23604UL, 0xc2ba6e58UL, 0x55a88a2dUL, 0xaf78edadUL, 0x1d587c5eUL,
+ 0xabc6d707UL, 0xf1c14465UL, 0x2b1550bfUL, 0x9f197b9cUL, 0x3bfd81caUL, 0xeae8f0ccUL, 0x65044bdbUL, 0x7c7bb327UL,
+ 0xf07bb98aUL, 0x2fe3ca91UL, 0x6aada290UL, 0xab77d70fUL, 0x2edca03dUL, 0x9ea3656UL, 0xde13f023UL, 0x45f329dcUL,
+ 0x5974c7UL, 0x403d1368UL, 0x45b76d34UL, 0xefd9d4fUL, 0xe2412919UL, 0x119c58c0UL, 0x85546669UL, 0x8333d145UL,
+ 0x938d421fUL, 0x839ed561UL, 0x3b6f2318UL, 0x2d437d27UL, 0x6d2e8a62UL, 0x3f08fa94UL, 0x23af5715UL, 0x8f4371dbUL,
+ 0xdd5eba94UL, 0x5508eb26UL, 0xaf1d9867UL, 0xfafaec9dUL, 0x49a9571bUL, 0x8fed2352UL, 0x2605f80eUL, 0x2b4cda9UL,
+ 0xa12d98faUL, 0xd5100530UL, 0x6cb1c2d3UL, 0x5e061db3UL, 0x13aa4356UL, 0xb1a10c9dUL, 0x8c4b94d9UL, 0x788e8faeUL,
+ 0x2dd620adUL, 0xdfed3299UL, 0x48289795UL, 0x6707a10aUL, 0x71be0e23UL, 0xa6eb4286UL, 0x2f5d392cUL, 0x9c086550UL,
+ 0xda3233fdUL, 0x349007b1UL, 0x187236cbUL, 0x8805f43fUL, 0x80d8efeeUL, 0xcfe93690UL, 0x98df4df5UL, 0xca5d3907UL,
+ 0xe5c3362eUL, 0x3a73e810UL, 0xc8059dbdUL, 0xb0b91e5UL, 0xef921ac3UL, 0x148ce837UL, 0x9f741969UL, 0x274f690bUL,
+ 0xef97a70aUL, 0x8e4e5ae9UL, 0x83d08d11UL, 0x8cfdaadbUL, 0xa566f931UL, 0x4a8b6d7dUL, 0x2cc9a876UL, 0xbc56ce7cUL,
+ 0x2ab4b9bcUL, 0xd0f3283bUL, 0xcdc6cf2fUL, 0x4cb103d5UL, 0xb31b1732UL, 0xa1027fbaUL, 0xf4290e6cUL, 0xa0f248c2UL,
+ 0x2ba9c7ecUL, 0x73cc00e1UL, 0xd1838bf7UL, 0xf6e95b40UL, 0xd70f5ec1UL, 0xbf4b2b33UL, 0x59950c0dUL, 0x56089658UL,
+ 0x7a9400d9UL, 0xd6c55431UL, 0x95268504UL, 0xd04d9275UL, 0x722e6295UL, 0x7bf40b7cUL, 0xe29b9f7eUL, 0x66be750cUL,
+ 0xc2f36636UL, 0x7a7051afUL, 0x4e5f2e1aUL, 0x41dc4820UL, 0x29580667UL, 0xe89a7a8eUL, 0xc04389d6UL, 0x95ce3cefUL,
+ 0xcd6ea225UL, 0xb4359f9cUL, 0xfb7b2336UL, 0x8deafe5bUL, 0x39baf1bUL, 0x8e6bc240UL, 0xefdecaddUL, 0x4c2c2613UL,
+ 0x53b012b9UL, 0xcede68a7UL, 0x451b7bb7UL, 0x5e98c234UL, 0x5a7cd5a9UL, 0x58ebe01dUL, 0x21c1b54UL, 0xcb955038UL,
+ 0xf1d900afUL, 0x27f21d5cUL, 0x866b261UL, 0x668dbb8eUL, 0x2f364edaUL, 0x7084d407UL, 0x93c73b58UL, 0x4a9b757cUL,
+ 0xafed90faUL, 0x78435021UL, 0x6740ac6bUL, 0x4419400dUL, 0x18ff90f6UL, 0x6cfa7517UL, 0xc73a3adaUL, 0xea1cb71fUL,
+ 0x81b81a71UL, 0x10dc43d3UL, 0x425af552UL, 0x28ab2d5UL, 0xb858da15UL, 0xe8856607UL, 0xad21d197UL, 0xaaf1c7f8UL,
+ 0xd672d182UL, 0x7f599e1bUL, 0x9bad8a39UL, 0x45af4e93UL, 0x9c427f74UL, 0xab215c00UL, 0x715165efUL, 0x5e1073a1UL,
+ 0x39996b97UL, 0x2b836e0bUL, 0x428d69f0UL, 0xaf94e4acUL, 0x21e2d656UL, 0x5169e9a6UL, 0x1742c261UL, 0xaca31e79UL,
+ 0x5f92a2a0UL, 0xe3cc0566UL, 0x6270f866UL, 0xdcdd656eUL, 0x3e92239eUL, 0xbf5d4265UL, 0xf74203d1UL, 0xae3ba6c9UL,
+ 0x3730ebafUL, 0xa04f0b32UL, 0xe9befb9cUL, 0xcd182d78UL, 0x6797befaUL, 0xb0134b6bUL, 0x83711296UL, 0x77ef757cUL,
+ 0xe7da2f77UL, 0xda2b6abfUL, 0x6431c325UL, 0x18d413b9UL, 0x417d1645UL, 0x36736071UL, 0xad4a68d8UL, 0x3ea1ddc1UL,
+ 0xa9bb70d6UL, 0x7cbe1751UL, 0x999e18c6UL, 0x4e60d8f0UL, 0xee8d1beeUL, 0xba93eed4UL, 0x5af2d6ffUL, 0xf32c904eUL,
+ 0xe32cd3b8UL, 0xad92a9d9UL, 0x5dcc675aUL, 0x3330648dUL, 0xc52c13c2UL, 0x2dd57b57UL, 0xafca56afUL, 0x7afbca0aUL,
+ 0x956612d2UL, 0x3fc9e113UL, 0x8cafa110UL, 0x652f2372UL, 0x84a7eeb8UL, 0x906aad09UL, 0x5cf0ad47UL, 0xb8b649f0UL,
+ 0x1da2c07aUL, 0xbca302cfUL, 0x2a9c3db4UL, 0x603bc314UL, 0x47962a94UL, 0x85cd8051UL, 0x428e0edUL, 0x69f1a37aUL,
+ 0x34b7f54fUL, 0x1e23307cUL, 0xbc2ca6cdUL, 0x44e87faUL, 0xb5c1376dUL, 0x54e71c2eUL, 0xf6be46f3UL, 0x27631590UL,
+ 0x2ffa7abeUL, 0x22cd32b1UL, 0xd48576e4UL, 0x8178cd33UL, 0x3d50f56bUL, 0xed58e7acUL, 0x9467bb74UL, 0x8b2104daUL,
+ 0xdf72b5feUL, 0x612279ddUL, 0x6397fe6bUL, 0x7a2f9931UL, 0xc9531793UL, 0xa09bcf9UL, 0x3d029151UL, 0x4b2455bcUL,
+ 0xb6f9b134UL, 0xe033ce86UL, 0xa51ccedeUL, 0xf50c3b61UL, 0x328bfba7UL, 0x2cfb7fb5UL, 0x49509779UL, 0x3ce0ffb8UL,
+ 0x241034d9UL, 0x325a5d9fUL, 0xd6dde459UL, 0xdba25998UL, 0xdecf5cd7UL, 0xe77e0215UL, 0xfff8e0c5UL, 0x8309856cUL,
+ 0x4ff5995dUL, 0x590f9c4fUL, 0x610ce255UL, 0xf69a43b6UL, 0x644347dbUL, 0x7cfa0075UL, 0x54e9326cUL, 0x27d6f783UL,
+ 0xfdea1fa1UL, 0x741b6e03UL, 0xf8b74ae1UL, 0x4bb8d889UL, 0x60fff5e3UL, 0xe939610eUL, 0x599c5517UL, 0x4d8f6246UL,
+ 0x739c123UL, 0xc3fd2ad0UL, 0x1e99a208UL, 0x7489ac20UL, 0x7cca0733UL, 0x709fd440UL, 0x88d02a7eUL, 0x24de0dc9UL,
+ 0xd67caef3UL, 0xfda3977UL, 0x7e9fc7f8UL, 0xd34ce612UL, 0x41b5880bUL, 0x35b55ab5UL, 0x354a8da8UL, 0x65f02f42UL,
+ 0x4278c2dfUL, 0x7611d65cUL, 0x1679cb0eUL, 0x7c7fe959UL, 0x6c82c7bUL, 0xaba59ac9UL, 0x43ceca63UL, 0x36a0c47cUL,
+ 0xb82205adUL, 0x932e68a4UL, 0x87cd3c32UL, 0x1c20a82aUL, 0x60f56c28UL, 0xe1351b3eUL, 0x1acfcaadUL, 0x528740d2UL,
+ 0xa82d164eUL, 0x17afdca4UL, 0x78f7685fUL, 0x96d09294UL, 0x67767c70UL, 0x2882456dUL, 0x6d6b092aUL, 0xd253eaaaUL,
+ 0x2814d1e6UL, 0xd4df8395UL, 0x8ddf990eUL, 0x4200e051UL, 0xe3118992UL, 0xa67fcf84UL, 0xa972b653UL, 0x7fab7a9bUL,
+ 0xc8080114UL, 0xd268ea66UL, 0xd84848f4UL, 0x83d908efUL, 0xda81ee93UL, 0xb9113bfdUL, 0xd1c78912UL, 0x80896bacUL,
+ 0x4af284d3UL, 0x855165bdUL, 0xac362fffUL, 0x754ea59aUL, 0x94ad4d7aUL, 0xc7424b7eUL, 0xe918bdb9UL, 0xbd99dffUL,
+ 0xdd621fe3UL, 0x404c6039UL, 0xab21c9baUL, 0x7f66d036UL, 0xde9364cfUL, 0x928fd2d1UL, 0x5efb9ecdUL, 0x212c7f83UL,
+ 0x7171800eUL, 0x69c61a22UL, 0x5a07dee8UL, 0x85463477UL, 0x70869cc6UL, 0x5402c6e5UL, 0x5f9f84dcUL, 0xdb0e971cUL,
+ 0xb7b6759bUL, 0x6ba9b9f3UL, 0xda28aa70UL, 0xf27d6361UL, 0xb63270c3UL, 0x8309cc2UL, 0x35723b1bUL, 0x6fcd1ab2UL,
+ 0xfd9932b5UL, 0xed21a510UL, 0xb229bbd4UL, 0xeba79ca3UL, 0x2f1f13b8UL, 0xf28e951dUL, 0x5963a71eUL, 0x67098dc7UL,
+ 0xe0f1e46fUL, 0x454fd7c8UL, 0xe38ac713UL, 0x4da8ca24UL, 0xbd039ed5UL, 0x753fc81bUL, 0x8387fe39UL, 0x4761f8ecUL,
+ 0xdd0a34cUL, 0xd54441adUL, 0xd59c222dUL, 0x95cb4fdeUL, 0x3cf89ddcUL, 0x2f4dfe21UL, 0xfba2a7f4UL, 0x2e76cda4UL,
+ 0x87ca0ae6UL, 0xdd5eb257UL, 0x6c01abe5UL, 0xa02cf62bUL, 0x433a4fdbUL, 0x55c75fc9UL, 0x4b9229a1UL, 0xe0ddc79fUL,
+ 0x930fc4dcUL, 0xe6bb91eaUL, 0xae4f1c20UL, 0xbdc16175UL, 0x2882d83dUL, 0xbf379195UL, 0xaa46cea3UL, 0xe20efd4eUL,
+ 0x479e0831UL, 0x7987a81eUL, 0x3e5eabfUL, 0xb6328a48UL, 0x1a16461fUL, 0x708bcea8UL, 0x1ac7691cUL, 0x79106b70UL,
+ 0xa0935dd3UL, 0x88dac612UL, 0x5e012c13UL, 0x6e97208bUL, 0x160c41e3UL, 0x3ffe263UL, 0x56033cc3UL, 0x55f7d6d2UL,
+ 0x57dbcb74UL, 0x222fc20fUL, 0x32010671UL, 0x5c1876bcUL, 0xe1025aa0UL, 0x66854edbUL, 0x8ea7f13dUL, 0xb66f66e2UL,
+ 0xe885e88aUL, 0x9195af86UL, 0x74f3cc0dUL, 0x60f5c5UL, 0x7c1852d3UL, 0xfbac2ebUL, 0x89577523UL, 0x2afca793UL,
+ 0x608b5597UL, 0xa6adc8c6UL, 0x72a8b6beUL, 0xdecc4bd6UL, 0x20353488UL, 0x243b7f7aUL, 0x2ac12da4UL, 0xb6d61f6cUL,
+ 0xeb72a994UL, 0x2abbcec0UL, 0xb621f832UL, 0x4d744771UL, 0xb074dfa6UL, 0x6a9e4997UL, 0xb5631be6UL, 0x73865d83UL,
+ 0xe6e6eec2UL, 0xeebe530fUL, 0x715de2e8UL, 0xbf4578cbUL, 0x46482607UL, 0x8e02d876UL, 0xfe74db2bUL, 0xda99bdfeUL,
+ 0xc31a37c7UL, 0x7d3c0e7UL, 0xb1fc4283UL, 0x542e14d3UL, 0x4c8f6cdaUL, 0xeae5cca8UL, 0xd3f52d57UL, 0x209fb288UL,
+ 0xfc7ef795UL, 0xabe96c8bUL, 0x1edf3969UL, 0xa375c0f3UL, 0xca14dc3fUL, 0x6907f660UL, 0xd44da8fUL, 0x47d9f797UL,
+ 0xd290e8a6UL, 0xbc3cd5b6UL, 0xfa589c4bUL, 0xbb05e9aeUL, 0xf6ea877eUL, 0x33b7ee2dUL, 0x1fabd978UL, 0x829e18d4UL,
+ 0xf6d07947UL, 0xd6753c37UL, 0x180c3e2eUL, 0xce8c90ccUL, 0x63f86bceUL, 0x6754e31UL, 0x2ec402b0UL, 0xb824cc74UL,
+ 0x1fb25dc1UL, 0xe7605689UL, 0xe34f2233UL, 0xcb7b96e9UL, 0xf69529f5UL, 0x656d2fbdUL, 0x1767831dUL, 0x10c240e4UL,
+ 0x97938aceUL, 0xb204957dUL, 0xd60b3714UL, 0xc32bcf3eUL, 0x7ec628c9UL, 0xfbdc31edUL, 0xd083a21dUL, 0x65f78fdfUL,
+ 0x81a73652UL, 0xefe52dbUL, 0x748b8192UL, 0x255e282aUL, 0x9ea6327dUL, 0xdda8ffd5UL, 0xae7cc6dcUL, 0xfc1e540UL,
+ 0xcaaccde1UL, 0x26556526UL, 0xd068c63fUL, 0x7449ff8eUL, 0x448a0ff0UL, 0x637fc619UL, 0xd640d0c9UL, 0x26c2690aUL,
+ 0x217039b0UL, 0xa0043006UL, 0x33ce2686UL, 0x9f4ddd90UL, 0xa5a5c29cUL, 0x72bfa77cUL, 0x19f87181UL, 0x74adcda8UL,
+ 0xa55c4160UL, 0x8097b167UL, 0x16153a50UL, 0x2bd813a5UL, 0x7541ade5UL, 0x6fa1cbadUL, 0xfe3c1c5cUL, 0x51b4e083UL,
+ 0x5ac38f5cUL, 0xeda07f34UL, 0xdce02e66UL, 0xffcdb66UL, 0xf33d2151UL, 0x25d7a070UL, 0xb7487c5cUL, 0xf15d8623UL,
+ 0xecc3855cUL, 0x22276bf7UL, 0x39fe3044UL, 0x954919d4UL, 0x93738898UL, 0x835c671fUL, 0xc83599c4UL, 0x1eb53d13UL,
+ 0x5095415aUL, 0xedad0aadUL, 0x33b6dc08UL, 0xa5763e9aUL, 0xfc80ec63UL, 0x891c883dUL, 0xecc12d3eUL, 0x38ac56eeUL,
+ 0xba2f511UL, 0xae346456UL, 0x5d65138eUL, 0xf5ebcda3UL, 0xb0543f30UL, 0x81c76818UL, 0x9b2022daUL, 0x102bb75UL,
+ 0x57c7157UL, 0xf63ba0a0UL, 0x44567a92UL, 0x788653b3UL, 0x3fbba190UL, 0x99b58f05UL, 0x5c6d3d7cUL, 0xbbff9b6UL,
+ 0x709d2714UL, 0x68e360f9UL, 0xf12c2ecbUL, 0x749c7312UL, 0xcaba57aUL, 0xacbc41c9UL, 0xf779ea6UL, 0x3ecba67eUL,
+ 0x363af303UL, 0x3746f974UL, 0x3cee9873UL, 0x149cd280UL, 0x86d65468UL, 0x3d1165bUL, 0x222a8fa1UL, 0x9f4d5133UL,
+ 0xc6677ac9UL, 0x2237f6c5UL, 0x81d8c39dUL, 0x953592adUL, 0xe5ac19ffUL, 0xea7dfe8bUL, 0x740cb90eUL, 0x94d984beUL,
+ 0xb0b804d6UL, 0xaa73a14UL, 0xb2bf010bUL, 0x98c13770UL, 0x81842794UL, 0x2ad39186UL, 0x4c0ccdfUL, 0x4dc698bdUL,
+ 0xcd48e96eUL, 0x41dda96fUL, 0xa682c024UL, 0xb45dee08UL, 0xe106f721UL, 0xf24cd49fUL, 0xb9dc2a50UL, 0xae7d961fUL,
+ 0x8d95bd0bUL, 0xd1b3b139UL, 0x2c063c1eUL, 0xbd6a9e50UL, 0xc9d0b9edUL, 0xd774db3aUL, 0x5d369a0eUL, 0x61baffffUL,
+ 0xf8656629UL, 0xb754da05UL, 0x5ea875b5UL, 0x5ff1ca84UL, 0x7e4a506bUL, 0x54930790UL, 0xca3a740dUL, 0x125380cdUL,
+ 0x9879e8a6UL, 0x6449fc95UL, 0x3ef92263UL, 0xab1f0c47UL, 0xdd365da5UL, 0xe4894f9dUL, 0x216c978aUL, 0x2c9a0068UL,
+ 0xbc9a18fcUL, 0x645a5f5dUL, 0xe9e0f512UL, 0xeacbc2feUL, 0x410906e7UL, 0x6b9b5136UL, 0xa21b447aUL, 0x9b223da7UL,
+ 0x9ebfb3caUL, 0x34e87e06UL, 0xbfa4376aUL, 0x6789f285UL, 0xc1fe481bUL, 0x62c2c7UL, 0x83da22b5UL, 0x3798c406UL,
+ 0x58799493UL, 0x1bbd7405UL, 0x45e89648UL, 0xdf0df5bbUL, 0xf46c0737UL, 0x6152f725UL, 0xab95f6e1UL, 0x31220d4bUL,
+ 0xa499ff41UL, 0xb9b973b4UL, 0xa3ee4e05UL, 0x802701e8UL, 0xe81b4897UL, 0x3b3979d7UL, 0xf40dd4c5UL, 0x8ad509d0UL,
+ 0x7cd7ba2fUL, 0xde345566UL, 0xf95b5b67UL, 0xfc8f168bUL, 0x4ee8da88UL, 0xc9131c8dUL, 0x5610ad2aUL, 0x35c2c5a2UL,
+ 0x506415aUL, 0xea05eb9fUL, 0x7c8bf39cUL, 0x3c4cfaf4UL, 0x870c678cUL, 0x1f682ba8UL, 0x4e5c03ddUL, 0x576e9ceeUL,
+ 0x93ca05b5UL, 0xfb9401a9UL, 0x2f80db5dUL, 0xe1261781UL, 0xa37a69aaUL, 0xa09f9f14UL, 0xcc7a5862UL, 0x7eb14b37UL,
+ 0x12eeb4bdUL, 0xde87218dUL, 0x8bbc000UL, 0x67fb11b4UL, 0xaf1cdebaUL, 0xd3930044UL, 0xf4715446UL, 0x5b83599eUL,
+ 0xe0400d7aUL, 0xe5914e9fUL, 0x3da543d2UL, 0x142d1015UL, 0x62a4900aUL, 0x1d39b8adUL, 0xdfd4fc18UL, 0x9a63dab1UL,
+ 0x120823d6UL, 0xc58b8efeUL, 0x6254aec4UL, 0x44faa75bUL, 0xfb2863b9UL, 0x69a725f8UL, 0x2846dfeeUL, 0x3b35cb33UL,
+ 0x3060aa7aUL, 0xc59bedd7UL, 0x81299f31UL, 0xfd5af91UL, 0x60f95479UL, 0x429dc092UL, 0x2dc573b0UL, 0x54273525UL,
+ 0xb7133b2cUL, 0x797b487fUL, 0x1865dc5dUL, 0xbd362e0UL, 0x3daefaafUL, 0x3920c601UL, 0xce430b81UL, 0x276a8692UL,
+ 0x733d708fUL, 0x9d8b70f4UL, 0x54c5ce1aUL, 0x8cc71116UL, 0x2eeca598UL, 0x78162797UL, 0xbadf5c96UL, 0xa9298d26UL,
+ 0xfec50e62UL, 0xb8df6af9UL, 0xdecaa49bUL, 0x63ec0e4eUL, 0x721cfc70UL, 0xcc2c0fdeUL, 0xc6a74b93UL, 0x5db285bdUL,
+ 0x7265c802UL, 0x18fee156UL, 0xff8a7a3fUL, 0x732ae651UL, 0x66748fbUL, 0x2cc4e995UL, 0x137dd7b7UL, 0x8fafe652UL,
+ 0x2e409b75UL, 0x72b5024dUL, 0x455007ceUL, 0xc2fc438eUL, 0xd331be09UL, 0xeac57ca8UL, 0xc2f7eddUL, 0x840f0523UL,
+ 0xbe0a2dd3UL, 0xda0a70e2UL, 0xde94ff73UL, 0x8a0114f8UL, 0xf35e166dUL, 0x1813da2bUL, 0x811e632eUL, 0x1243e4a4UL,
+ 0x50042255UL, 0xe0e80b59UL, 0xfeca8180UL, 0x9854bd9fUL, 0xe4a7e012UL, 0x62529105UL, 0x22c56e75UL, 0x247c894eUL,
+ 0xfd1776eeUL, 0x2ec853c9UL, 0x24a6af12UL, 0xcc9fa34cUL, 0xaf633832UL, 0x2d7c6d1fUL, 0xc70fa51fUL, 0xd648ec3eUL,
+ 0x42f53091UL, 0x27513b3bUL, 0x7da79a33UL, 0xf8acebf4UL, 0x84c78412UL, 0xfb366eaaUL, 0x71230574UL, 0xd0e87f80UL,
+ 0x8fd2d273UL, 0xf6c0f8b0UL, 0x8da7f7f2UL, 0xb8a83033UL, 0x6ee9e4a1UL, 0xefdc7cc0UL, 0xe64df11dUL, 0xde42070fUL,
+ 0xb43b83f3UL, 0x5535afffUL, 0x9c8b5ecdUL, 0xa28d4982UL, 0x36daf679UL, 0x6adbf319UL, 0x24b0ad3UL, 0xb5b903f1UL,
+ 0x1b36d3b0UL, 0x46085ae5UL, 0xc48569b7UL, 0x2b97110eUL, 0x37a9b414UL, 0x87bb5051UL, 0x2309896bUL, 0x9670c2c7UL,
+ 0x22145059UL, 0xcecb5f5eUL, 0xb3859660UL, 0x52c6fb75UL, 0xe5959600UL, 0xea40503UL, 0xc620e080UL, 0x83756f1cUL,
+ 0xc17fd371UL, 0x3d7b9e9UL, 0x61a23ffcUL, 0x37b369c1UL, 0x2333a648UL, 0xefcf9a6aUL, 0x48afb520UL, 0x1011e36cUL,
+ 0x40c0c130UL, 0x6920cfceUL, 0xc0ff1620UL, 0x9d1f765eUL, 0x411742eUL, 0x42889852UL, 0x3c1407c1UL, 0xa941ab26UL,
+ 0xb9c55ba2UL, 0xdb429aa2UL, 0x4d99366eUL, 0x101779d3UL, 0x9a3f7115UL, 0x35ee2115UL, 0xa3ee8488UL, 0x84ad6711UL,
+ 0xd36d18cdUL, 0xd7e91576UL, 0xa0cae92fUL, 0x8d870122UL, 0x5272a4a3UL, 0xdd46caabUL, 0x9c7ebcdcUL, 0x75fb719fUL,
+ 0xc26541bUL, 0x8541c96UL, 0xca2279d2UL, 0x3467d72eUL, 0xd66ba24eUL, 0x9d4190a7UL, 0xb682615eUL, 0x7c3c95adUL,
+ 0xa2e9fba5UL, 0x4cd86482UL, 0xa3790f73UL, 0xbdb0dc98UL, 0x97bb5893UL, 0xdcf80d67UL, 0xb5f3c389UL, 0xa579cd90UL,
+ 0x6714a798UL, 0x6743719fUL, 0x35534958UL, 0x67a2f2a7UL, 0x5155bde4UL, 0x4cd16488UL, 0x9538995aUL, 0xe5b222fdUL,
+ 0xa2e1da44UL, 0x24439556UL, 0xaea4a1d7UL, 0x6a3d2b83UL, 0x186ffbf8UL, 0x2e9ac7b7UL, 0x825c16e2UL, 0xa4685d47UL,
+ 0x582f02e1UL, 0xf24f9078UL, 0xfdb749ccUL, 0xcfefa7bUL, 0xba25450bUL, 0xa9b21bb6UL, 0x984d697aUL, 0x79ace07UL,
+ 0xfc6747f1UL, 0x292fcc78UL, 0xb7cbefceUL, 0xaaf9c719UL, 0xafb63127UL, 0x107b14ccUL, 0xf8ee5e0UL, 0x58b2ca07UL,
+ 0x5a90112fUL, 0x119fbed1UL, 0xca7fbb8bUL, 0x70418516UL, 0x1cb7bd0bUL, 0x11712802UL, 0xb2facdbfUL, 0xb5777724UL,
+ 0xfcd7a072UL, 0x8e2ccd0fUL, 0x5548d0c6UL, 0xf42a44e6UL, 0x37308af4UL, 0xab7af62bUL, 0xbaf44540UL, 0x91ccbef7UL,
+ 0x9c1920a5UL, 0xf342da4fUL, 0x93edbcfcUL, 0xfa61c0acUL, 0x86d2467cUL, 0x71554d7bUL, 0xb99e7cc1UL, 0xd1ed1fd9UL,
+ 0x5ba7832UL, 0x977e87c2UL, 0x17066c0dUL, 0xf3fb1b8bUL, 0x8160cd89UL, 0xc6f7610eUL, 0x29f9ac2UL, 0x68d78dcfUL,
+ 0x7243d4dcUL, 0xd08b8a54UL, 0xae41312bUL, 0x54258b4fUL, 0x1d7f9abcUL, 0x7ba33cd3UL, 0x386f82a3UL, 0xac38ad24UL,
+ 0x3baf6903UL, 0x395aad60UL, 0xb417a1bdUL, 0xf83a174UL, 0xbaabf6bcUL, 0x527486e8UL, 0x49841f63UL, 0xd9b2ebf3UL,
+ 0xea1ebb7dUL, 0x5238e713UL, 0xe2c1ad0cUL, 0xae9ed2f6UL, 0x57031defUL, 0x70f12e42UL, 0x51694fdeUL, 0xdb95e789UL,
+ 0x71453375UL, 0x36b86324UL, 0xca006b6bUL, 0x401b281fUL, 0x4579f212UL, 0x96b318a2UL, 0xe3e4cc9aUL, 0x6c5445a8UL,
+ 0x1bcbfbbdUL, 0x72e2c86cUL, 0x314bcac3UL, 0x4d74858eUL, 0xcab61313UL, 0x5d80d412UL, 0x34227181UL, 0xac8bf826UL,
+ 0x275749a4UL, 0x9e549223UL, 0x608354b4UL, 0xbf1a9fbdUL, 0xec1cf150UL, 0x19209a15UL, 0xee1c4fe7UL, 0xf55da987UL,
+ 0xabc66d84UL, 0x8a75cc03UL, 0x424c1d67UL, 0x1f0b0207UL, 0x6d9adf8fUL, 0xf16a4552UL, 0x73bb89b7UL, 0xb7091fb8UL,
+ 0xe8098073UL, 0x434f1ab4UL, 0xe7662f51UL, 0x68b13b1UL, 0x5eb46889UL, 0xa27e94bbUL, 0x76296165UL, 0xcb11b7ddUL,
+ 0xc098652dUL, 0x4d614986UL, 0xfb160b65UL, 0x5006a5ceUL, 0xc6c0d3d7UL, 0xc36ace0dUL, 0x980b6977UL, 0x305e994bUL,
+ 0x9caa6662UL, 0xf7125645UL, 0xfc05d6a5UL, 0x811f74a4UL, 0xf28620d8UL, 0x7da2f34UL, 0xb0366441UL, 0x23a3740cUL,
+ 0x7a9f2241UL, 0x7f754828UL, 0x80fa1726UL, 0x752308e9UL, 0xe5159cc5UL, 0x28391fd2UL, 0x63a51fd6UL, 0x5e4bdc23UL,
+ 0x3ef3d852UL, 0xbc7f8815UL, 0xe026090fUL, 0x5f1b5ad9UL, 0xc73a0942UL, 0xb2c56de7UL, 0x7ddd61ebUL, 0xb24ebb4eUL,
+ 0x6fe68878UL, 0x11d516daUL, 0xf7c5afdUL, 0xb8932395UL, 0x5781ef4cUL, 0x7de3a76fUL, 0xc345fe38UL, 0xa0085c88UL,
+ 0x8d648ad8UL, 0x3335624aUL, 0x6eea9df5UL, 0x93339ea0UL, 0x978d7286UL, 0x2b1082c2UL, 0xf239eb07UL, 0x46e1d020UL,
+ 0x5d92d07eUL, 0xcd9b3e97UL, 0x357998e4UL, 0x389d1e45UL, 0x9502bd30UL, 0xb80d8e92UL, 0x5d05c97cUL, 0x528b11d2UL,
+ 0xd3250751UL, 0x99cfcd1eUL, 0xfe9e5f6cUL, 0x6f304821UL, 0xee99e259UL, 0x6aa1f9f7UL, 0x7f189484UL, 0x4cc0d517UL,
+ 0x20e09c30UL, 0xa7f6ae81UL, 0xbd5b7c1fUL, 0xc465d02bUL, 0x1eaac7b8UL, 0x2d13b545UL, 0x52deec5eUL, 0x44de461UL,
+ 0xc926b5aUL, 0x17a35bfaUL, 0xfb0cee2cUL, 0x7d4647f2UL, 0x601c4b26UL, 0xb9a6a6b5UL, 0xbc6b8be8UL, 0x4c8bb442UL,
+ 0xaf778feeUL, 0x1cc5d5c8UL, 0x8e803b76UL, 0x70b814fUL, 0xb74cce80UL, 0x4463da5dUL, 0xcd5b3a6aUL, 0x2144b2e8UL,
+ 0xb9c6be05UL, 0x1a2a4a3dUL, 0x9a172ebfUL, 0x2af379c7UL, 0xfc226d6eUL, 0x1ef858dbUL, 0xfa86a6d2UL, 0x69a4e201UL,
+ 0xbe488a9bUL, 0xf67d007bUL, 0x20a3742bUL, 0x3ef55dd1UL, 0xd48eb943UL, 0x553c7f67UL, 0x2bf9709aUL, 0x9717432fUL,
+ 0xf7d3ab49UL, 0xfba3d8ecUL, 0x3089ef09UL, 0x88d19f4UL, 0xd011fc73UL, 0x11d1941cUL, 0x8eb99552UL, 0x9056e6ebUL,
+ 0xf10bda5bUL, 0xeb248deeUL, 0x1e3ff0c5UL, 0x247d2c4UL, 0x5af6aeddUL, 0xac1783cUL, 0xc4aa0619UL, 0xea8d6052UL,
+ 0xb5f28100UL, 0xeb981710UL, 0x380dc44eUL, 0x2ece6829UL, 0xe54afbbfUL, 0x405f3da1UL, 0x4e5f47fbUL, 0x4b4a916bUL,
+ 0xbe98559aUL, 0x51969ba8UL, 0xf1bf563bUL, 0x23c0dae2UL, 0xe35326bcUL, 0x47a7973fUL, 0x10386e66UL, 0xcf8c62d2UL,
+ 0x522c2ecaUL, 0x49ec3a99UL, 0x3fc47a69UL, 0x154ade3dUL, 0x14553505UL, 0xa60c8b56UL, 0x1bf25a66UL, 0xe5aaa5d6UL,
+ 0x3e78560UL, 0x9164b2e0UL, 0xa3dcbf93UL, 0xd5f9206aUL, 0x4e14054UL, 0xedc9f24dUL, 0xad36fbacUL, 0xb81955dUL,
+ 0x8a8a461bUL, 0x4664c86fUL, 0x880169e0UL, 0x7743af38UL, 0x583d8d3fUL, 0x462c76fUL, 0x4b9b3e55UL, 0xd396d76UL,
+ 0x47556139UL, 0xce6e442aUL, 0x39915985UL, 0xa817e85aUL, 0x1a7384e5UL, 0x13c2a4b4UL, 0xda6ca730UL, 0xa79a741dUL,
+ 0x3b839e49UL, 0x68f843e0UL, 0xe2f87352UL, 0x3272797bUL, 0xb861bbefUL, 0x13da6ebcUL, 0x45153ca0UL, 0x8390d04UL,
+ 0x8548e387UL, 0x3c8df2b9UL, 0xcfaa5cfeUL, 0x997af813UL, 0xc116af70UL, 0xb5ca5fd7UL, 0x157372e2UL, 0x6a6f8bd8UL,
+ 0x172daa2eUL, 0x28d58d87UL, 0x549902cfUL, 0xcbbd869UL, 0x61a113ebUL, 0x26b0e8a7UL, 0xa8d979eeUL, 0x6139d0UL,
+ 0x3189cf01UL, 0x569a65b7UL, 0xf35463caUL, 0xd0a3e788UL, 0xd7efd801UL, 0x6d2d2a4eUL, 0xb17b5dc4UL, 0xcb473b24UL,
+ 0x97b4633fUL, 0x1638289eUL, 0x5267b7d3UL, 0xf08415c7UL, 0xf4b36e10UL, 0xbfbba539UL, 0x80a8559UL, 0xe8609655UL,
+ 0xc2d4ede1UL, 0x4aebee51UL, 0x6a494f2fUL, 0xaf13de5aUL, 0x29b1a9ffUL, 0xff62d378UL, 0xf9010faUL, 0x7848dc1dUL,
+ 0x302b003UL, 0xac2a1177UL, 0x11571a5dUL, 0xc4bf65cfUL, 0x19914b7dUL, 0xdb8b5909UL, 0x4b6248bfUL, 0x548a22a3UL,
+ 0xc16ff0ceUL, 0xb479845dUL, 0x97eca628UL, 0x60ab539aUL, 0xa671bfd1UL, 0xe030b931UL, 0x7b94bfd7UL, 0xd4c976c5UL,
+ 0xf5af4dcUL, 0x96b37d22UL, 0x23c2a67dUL, 0xf8b269e2UL, 0x5f547f18UL, 0x48621be9UL, 0xc6bb5cbbUL, 0x54d0847aUL,
+ 0x17ded5d4UL, 0x6bd84253UL, 0x9550ec0cUL, 0x341b896fUL, 0x5ad3be3eUL, 0x2564ee82UL, 0x17bfdbfdUL, 0x1aba1151UL,
+ 0x1197e74bUL, 0xdaf1d326UL, 0xd37cfae4UL, 0x96c49323UL, 0xd52c0190UL, 0x1478c332UL, 0xdb7e9fc0UL, 0x7512fe14UL,
+ 0x50d9d009UL, 0x5eaa9097UL, 0x89c3af89UL, 0x5d7f0e84UL, 0x157e3c24UL, 0x4ae24286UL, 0x7092c79dUL, 0x1133a3daUL,
+ 0x8b8b994bUL, 0x1b1fa21UL, 0xddedef1eUL, 0x87db25c7UL, 0x1207604UL, 0x1f766e98UL, 0x7665ac4aUL, 0x1e5f7576UL,
+ 0xc32896f5UL, 0xb9e1d33bUL, 0x737e7a4dUL, 0x3d388bcbUL, 0x1c35da13UL, 0x561776a1UL, 0xfbb4fc4cUL, 0xaa12e0d9UL,
+ 0x28848c10UL, 0x1f6f61ffUL, 0xd3a6839dUL, 0xdf5c5c6aUL, 0xda6c2622UL, 0x8db1339UL, 0xe0699997UL, 0xca49c62UL,
+ 0xc2ee89c9UL, 0x58cf06a4UL, 0x5d35626fUL, 0xd225e0a4UL, 0xd66b5d85UL, 0xc9f43b69UL, 0xfc055883UL, 0x14ea28c8UL,
+ 0xccd3e8baUL, 0x860689fdUL, 0xe1ce22b9UL, 0x29baff3fUL, 0xcdc92397UL, 0xc4e068c6UL, 0xea00ec72UL, 0x40a0c6fdUL,
+ 0x27500f7fUL, 0x9cff765bUL, 0x438ec076UL, 0x3e8e1783UL, 0xb5db25f8UL, 0x7c6f7effUL, 0xfdf81b75UL, 0x770b4d9bUL,
+ 0xed40bd21UL, 0x523784bcUL, 0xb0ddd560UL, 0x4df275e7UL, 0xefd42b16UL, 0x2295652UL, 0xed30c5b6UL, 0x8983358fUL,
+ 0xb8a6196UL, 0x39333d72UL, 0xa5e25bbcUL, 0x67e08c6cUL, 0x2cb97ebcUL, 0xf77655a6UL, 0xd8c98995UL, 0x659d2ccdUL,
+ 0xca6340a4UL, 0x7afccb5bUL, 0x1cf1d904UL, 0xf4c09ea9UL, 0xffb602f6UL, 0x4a1599c7UL, 0x6c90eb9dUL, 0xb9ffc14bUL,
+ 0xefbd690fUL, 0x45578fb1UL, 0x44fb970aUL, 0xd3db64bdUL, 0x15276d39UL, 0x38313b9fUL, 0xb1a91be4UL, 0x2541b1dUL,
+ 0xa6e6150fUL, 0x44f119d0UL, 0x5c47d459UL, 0xffcab51bUL, 0x28f6c062UL, 0x44649d9eUL, 0x72ae9f6eUL, 0x3af5fbd4UL,
+ 0xb3db454fUL, 0x17573fc2UL, 0xfdb681b8UL, 0x622a81e8UL, 0x2ffaa880UL, 0x4dbf5493UL, 0x807f0d3bUL, 0xa9189c16UL,
+ 0x74ba70a9UL, 0x4cf9e7ebUL, 0xdaadd769UL, 0xc7aab1c2UL, 0x8e2308e9UL, 0x412f417bUL, 0x267c8492UL, 0xcdb1d51cUL,
+ 0x161ff97UL, 0xed04f9abUL, 0x25df746eUL, 0x97d81b01UL, 0xc19c3f32UL, 0x4936a17UL, 0xbb908180UL, 0x73d9a6c8UL,
+ 0x6099162bUL, 0xbd3b1dcfUL, 0xd0dde2adUL, 0x27e6b144UL, 0xf61180aUL, 0xabcdd87UL, 0xfc626fa7UL, 0x3c3e734UL,
+ 0xde54a531UL, 0x5968813bUL, 0x2969be00UL, 0x4b5c5d3fUL, 0x71efc760UL, 0x1a658079UL, 0x17c7320fUL, 0xa8602bfeUL,
+ 0xb446d34cUL, 0x5b2a2e11UL, 0xe3abefb0UL, 0x88e16573UL, 0xb782a3caUL, 0x7f708065UL, 0x5a75be5UL, 0xf2bb73a3UL,
+ 0x392877f6UL, 0x1433c24aUL, 0x5f8f62b2UL, 0x6d65b422UL, 0x8ffbd878UL, 0x8cd1e46fUL, 0x3490304aUL, 0x8c35a6d9UL,
+ 0x748b55f4UL, 0xe5c87e11UL, 0x87e3439dUL, 0xab80e733UL, 0xd29e71f4UL, 0x349b8d2bUL, 0x7adda4a6UL, 0x4644080cUL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0xae5c1b1dUL, 0x4fd1a980UL, 0xfcb63a9fUL, 0x30caa5aUL, 0x14ced05dUL, 0x410ee062UL, 0xdb65b5cUL, 0x963d5894UL,
+ 0xb15ac0ebUL, 0x9b1a8630UL, 0x539fca8aUL, 0x9b1c639fUL, 0x49a7cfc5UL, 0x8f90de0eUL, 0xb2b9c8efUL, 0x193517beUL,
+ 0xf21a228bUL, 0x2065d669UL, 0xf11fcf03UL, 0x3d20e930UL, 0xf1f44037UL, 0x1843948fUL, 0x727fdd47UL, 0x953f04e8UL,
+ 0x10d5d709UL, 0x84099c22UL, 0xb816fa0bUL, 0x58cf3766UL, 0x41fcca43UL, 0x6e60b4d3UL, 0x11eb813eUL, 0x4d4e4881UL,
+ 0x7b4d35bcUL, 0xd54b1e74UL, 0xa5518e30UL, 0x9a7dcaeUL, 0xee48fa2cUL, 0x99a1756eUL, 0x198fcb34UL, 0xd44c94c8UL,
+ 0x630fd7d8UL, 0xf6c16d6fUL, 0x8b4318fdUL, 0x3be91922UL, 0x855b3f67UL, 0x163a6df4UL, 0x34eec220UL, 0x12e79bc4UL,
+ 0x27c5c85aUL, 0x832d9bcbUL, 0x10e94158UL, 0x1848e533UL, 0x7b51b360UL, 0xcb155319UL, 0x98d035e2UL, 0x1ddf01a6UL,
+ 0x9bb38e22UL, 0x18fd0fcbUL, 0x90e5bb39UL, 0x28f9a688UL, 0x348d5b77UL, 0xfff420c5UL, 0xb05d28b0UL, 0x4e118dcdUL,
+ 0xf3b88272UL, 0x25686912UL, 0xe81752a1UL, 0x3f5b60b9UL, 0xdb959d07UL, 0x8c67cf97UL, 0x33964ea5UL, 0x9c7970ceUL,
+ 0x77cccf1dUL, 0x52619bccUL, 0xc3d73359UL, 0xf231a51cUL, 0x4948e083UL, 0x42ca6bc9UL, 0xe0ca151aUL, 0x9852e556UL,
+ 0xfb6fe930UL, 0x5efd6bb9UL, 0x2cc06608UL, 0x4924bcb5UL, 0x1999e283UL, 0x27fa956cUL, 0x748433e7UL, 0x9b4d42faUL,
+ 0x995e2551UL, 0x31215a60UL, 0x6a330babUL, 0x16974411UL, 0x6ea58f08UL, 0x30830d0bUL, 0x235a3da9UL, 0x64106facUL,
+ 0xd0e68013UL, 0x2de46377UL, 0xfbc1753dUL, 0x40a8d196UL, 0x24ef8d38UL, 0x54f517d9UL, 0xed4289e8UL, 0x2b172ac9UL,
+ 0xf81c288aUL, 0x72e7b9d7UL, 0xe3fbd481UL, 0xf00c8bc9UL, 0x8abdec0UL, 0x33e091eeUL, 0x7e3d7c41UL, 0x14cce6ebUL,
+ 0xe9053176UL, 0x42fe3edUL, 0x54c0782dUL, 0x7634dafaUL, 0x3374fb7UL, 0x7a09f1cbUL, 0x87925c97UL, 0xe3b03703UL,
+ 0xe35accb9UL, 0x1351f200UL, 0x12ec5969UL, 0x85e35d17UL, 0x3d165701UL, 0x1a47baf5UL, 0x27f10188UL, 0xba6cae1fUL,
+ 0xead273f5UL, 0xd88321daUL, 0xf4b167c6UL, 0x872e3d4aUL, 0x1bad5c44UL, 0x15e80bc0UL, 0x8a4ce9ddUL, 0xcc764330UL,
+ 0x9804ca9aUL, 0xe78ee7eeUL, 0xc4955740UL, 0x5e62f75fUL, 0xce958fc3UL, 0xdc1be7fcUL, 0x8ee8e994UL, 0x40fdada6UL,
+ 0x2c486457UL, 0x3d1e192aUL, 0xe3e54c87UL, 0x5e150b4eUL, 0x51e3ed62UL, 0xcc2d78eUL, 0xcb9e0963UL, 0xe5c4e4eaUL,
+ 0xe86457f5UL, 0x12550aa2UL, 0x783c8229UL, 0x641a4d21UL, 0xf0948bfaUL, 0x2c8a9f31UL, 0xc9878755UL, 0xcdbcee02UL,
+ 0x914d2a99UL, 0x2978ae49UL, 0x37281224UL, 0xea4e8323UL, 0xc121737cUL, 0x1792a8cbUL, 0x828ab278UL, 0x4e110fe6UL,
+ 0x49854983UL, 0xe34a882UL, 0x5eb7eae2UL, 0x57ac5337UL, 0x4f2cfe8eUL, 0xe2d59a3cUL, 0x711fe2feUL, 0x7e0da884UL,
+ 0x9d3bca14UL, 0xa9df81cdUL, 0xd7921260UL, 0x610f6148UL, 0x70ba963aUL, 0xb8074d5eUL, 0xcc400cdcUL, 0x9e589812UL,
+ 0xfef40cefUL, 0x5c846162UL, 0xcb50360UL, 0xe397303UL, 0x18544a3UL, 0xece20b98UL, 0xdfba582cUL, 0x29a6c69bUL,
+ 0x98e212d3UL, 0x258ccf5cUL, 0x9d98dbadUL, 0xfae303cUL, 0x40b4070eUL, 0x174537ffUL, 0xefb22fbdUL, 0x9195811cUL,
+ 0x9f04a9ebUL, 0x641c6485UL, 0xdc917a0eUL, 0x26a5f72UL, 0x868fb45dUL, 0x46bd2dafUL, 0xfddd53efUL, 0x759b12bUL,
+ 0x3ee82013UL, 0xf722cf13UL, 0x4dab59baUL, 0xc85a4480UL, 0x3246868cUL, 0x8f6cc54cUL, 0x94ccb3b6UL, 0xd01ee5e1UL,
+ 0x96b858daUL, 0x96165a6UL, 0x2f9e747bUL, 0xa242f278UL, 0xfa936ab2UL, 0xdf561bUL, 0x53e1880cUL, 0xadc1f71cUL,
+ 0x1052ad86UL, 0xa21d3365UL, 0x3ef778eeUL, 0xd5f9395eUL, 0x4b024970UL, 0xf5f09275UL, 0x4cba245dUL, 0x6e307f15UL,
+ 0x8ff042d7UL, 0xe700b111UL, 0x14183742UL, 0x7930ac69UL, 0x64747ccUL, 0x1af41005UL, 0xbcaf971UL, 0x896c6925UL,
+ 0xd81974feUL, 0xe5428e77UL, 0xc8887f61UL, 0x5db31e9dUL, 0x42f021d8UL, 0x1b857f0eUL, 0xb8c68603UL, 0xeef05da7UL,
+ 0xefb64e63UL, 0x13ded47eUL, 0x839828d1UL, 0xa751ae21UL, 0xdef2f2e0UL, 0x67cc915bUL, 0xd7cf387UL, 0x43fa11c1UL,
+ 0x60b1c021UL, 0xd2351175UL, 0x1eb3a5fbUL, 0x2e10dd4eUL, 0x8216f76bUL, 0xbd504545UL, 0x4a10ccb1UL, 0x6179bea9UL,
+ 0x962fbee5UL, 0xb01c3b59UL, 0x37a9af49UL, 0xb9122d16UL, 0x39e02565UL, 0x4406d8b6UL, 0xdaa6c801UL, 0xe2b941daUL,
+ 0xac7f213aUL, 0x347a0dbbUL, 0x502ccb92UL, 0x4ad45d2bUL, 0x4467e6aaUL, 0xb2f78641UL, 0x191bea44UL, 0x85c9d828UL,
+ 0x7810ee12UL, 0xba3a9f1fUL, 0xea1b3803UL, 0x703397d8UL, 0x15200896UL, 0x107940e3UL, 0x5771df5fUL, 0x46872b9eUL,
+ 0x92656a30UL, 0xdd05e362UL, 0xe47c23bdUL, 0xd5177883UL, 0x6b0bde75UL, 0x456905c7UL, 0xf81f8d45UL, 0x3d6c7647UL,
+ 0x3aa3a1daUL, 0x2a56fc6cUL, 0x4531c627UL, 0x224d9935UL, 0xb2d2117UL, 0xda30bd7aUL, 0xc7032f33UL, 0xf2197ceeUL,
+ 0x1fc4172eUL, 0x18be78cfUL, 0xd3de8a38UL, 0xa7f005b0UL, 0x7c03611dUL, 0x9c5d0bb2UL, 0x62e53e81UL, 0x7cda2b9dUL,
+ 0xd0e2d8e2UL, 0xda7859e2UL, 0xf6256c1cUL, 0xe1d91c3UL, 0x76149ce0UL, 0xcbe3a474UL, 0x25018fe0UL, 0x78bc493aUL,
+ 0x1ad190b0UL, 0xe7d13205UL, 0x3136321dUL, 0x70649429UL, 0x7d6d5defUL, 0x118986cdUL, 0x8d4f5e4dUL, 0x55451cb6UL,
+ 0x2325a5e4UL, 0x45aa724dUL, 0xe86e0affUL, 0x66a373f7UL, 0xf4c8262aUL, 0x85104968UL, 0x3c9b5611UL, 0xa0699255UL,
+ 0x35c36f45UL, 0xa7a638a2UL, 0x67e4c070UL, 0x7d204290UL, 0x95f15f70UL, 0x1284743eUL, 0x6ae44866UL, 0xe7dc2211UL,
+ 0x46a487f3UL, 0xc0e7eb78UL, 0xcfe363fcUL, 0xf396258dUL, 0xd04bef2dUL, 0x194824b7UL, 0xb5d4c711UL, 0xc8f8bdf0UL,
+ 0x794587b6UL, 0x5fc881cUL, 0xa870ecdeUL, 0x1b885be8UL, 0x6ef7eab4UL, 0xd03b460eUL, 0xc7c1c124UL, 0x19fe6c1UL,
+ 0xf5ebe375UL, 0x8b6adcb6UL, 0x18985cecUL, 0x719c55c0UL, 0xd2925b2aUL, 0x6d7bd32eUL, 0xd2427a04UL, 0x380688b5UL,
+ 0x4fc27240UL, 0x6413a9b0UL, 0xc687b625UL, 0x13527b57UL, 0x90665260UL, 0x6de826cfUL, 0x6e84af2eUL, 0x4f60f3e6UL,
+ 0xded888f8UL, 0xaa091f8eUL, 0x86eefe5UL, 0xad5b8676UL, 0x21320520UL, 0x1fa91bb1UL, 0xa5478c7bUL, 0xfb675ab6UL,
+ 0x93d28edcUL, 0xfece844fUL, 0x1e7baea9UL, 0xc0dc2cfUL, 0x35102089UL, 0xd91c26d6UL, 0xa4a2bacbUL, 0xdeb5b694UL,
+ 0x54fd5631UL, 0x9eeb33c5UL, 0x65668e1UL, 0x8ffd7413UL, 0x29589001UL, 0x946679ddUL, 0xb2d666ceUL, 0xbe39361dUL,
+ 0x24ef23edUL, 0xd899aaccUL, 0xc19061a6UL, 0x21d8af12UL, 0x35fd0365UL, 0x5bdae588UL, 0x66d6c04bUL, 0x75ab8acaUL,
+ 0x322447aUL, 0x85da44feUL, 0xa38baa45UL, 0xc544427bUL, 0x778c182aUL, 0x3cce1ab8UL, 0x40c5ba78UL, 0x61494ce4UL,
+ 0x50d9775cUL, 0x9179e6b3UL, 0x133f9a7dUL, 0xf8b1275fUL, 0x18c8dec3UL, 0xacaaf5f4UL, 0x843020bdUL, 0xdcf37e49UL,
+ 0x6523ef84UL, 0xefde2e41UL, 0x9d6a88a5UL, 0x91938eb2UL, 0x4ac0c217UL, 0xc41d1351UL, 0x70459993UL, 0xaa6c2b7fUL,
+ 0x69387273UL, 0x6f0cfc4bUL, 0xe8502134UL, 0xe0d57adaUL, 0xe41213bdUL, 0xd9c86854UL, 0xbed405cfUL, 0xa4708e24UL,
+ 0xef3d2e21UL, 0x48eaa13fUL, 0xb37818d5UL, 0x172da332UL, 0x2f2cce2eUL, 0x2e3ff5c8UL, 0xffcdaf11UL, 0x61014330UL,
+ 0x2a0f05f5UL, 0xc6a2315cUL, 0xccd93ea8UL, 0xcbe599UL, 0x83e4b64eUL, 0x920c7dbfUL, 0x2ad5fafUL, 0x86637209UL,
+ 0x8775fed0UL, 0xb01a0b10UL, 0xb942408aUL, 0x73521ed6UL, 0xce0a0cbfUL, 0x443087d8UL, 0x604d7289UL, 0x444e0556UL,
+ 0xb0a7d767UL, 0x7bb0161cUL, 0xc76e0237UL, 0x99ddf87eUL, 0xfb32e998UL, 0x782e15a3UL, 0xfb89da13UL, 0x74b3a6caUL,
+ 0xa161bc34UL, 0x4505f2aUL, 0x622b18bdUL, 0x4fbd17abUL, 0x55058102UL, 0xa6db1287UL, 0xc50cb724UL, 0x1ea01419UL,
+ 0xc9af0a20UL, 0x24cb77a6UL, 0xd066e94bUL, 0xfbda7782UL, 0x504672UL, 0xe666d93eUL, 0xf62db71eUL, 0xec89a356UL,
+ 0x31c6b63cUL, 0x885b2fb8UL, 0x80cfc6cdUL, 0xcefd6ffbUL, 0x90b1dcbdUL, 0xb10a2ef0UL, 0x64b23768UL, 0x85a8789bUL,
+ 0xee47b64bUL, 0x68272bd5UL, 0xeabb1d60UL, 0x5498ab6UL, 0x1e1f2ec4UL, 0x6fc9ce27UL, 0x902ab905UL, 0xdf8bb706UL,
+ 0xf6b3770UL, 0x5ba64eadUL, 0xb96e3b8UL, 0xa6975f3fUL, 0xd306b644UL, 0x355b42e0UL, 0x337192feUL, 0xced4bd21UL,
+ 0x10e19787UL, 0x70729d11UL, 0x6b593c6bUL, 0xef68333aUL, 0x4f0f5ed6UL, 0x1d44be37UL, 0x2aa3fa2bUL, 0x53723641UL,
+ 0xdbb6055bUL, 0x33fab153UL, 0x80aae46aUL, 0xaebf3597UL, 0xa70e4105UL, 0xe3655e70UL, 0x198da9f5UL, 0xc1547c33UL,
+ 0xc11c521UL, 0xa221f176UL, 0xff361568UL, 0x3f29d365UL, 0xa6b89e92UL, 0x9dd1ba65UL, 0x657ec0d3UL, 0x68bf3b0fUL,
+ 0xf8c77f81UL, 0xd5305553UL, 0x90e6973eUL, 0xf88daf93UL, 0xbf083971UL, 0xd7baa83UL, 0x7bd90de5UL, 0xe40bbc5dUL,
+ 0xef73b31fUL, 0x4622ac08UL, 0x5026666cUL, 0x4abaced4UL, 0x4dc3d7fdUL, 0x8f5db700UL, 0x863d4abdUL, 0x3d4a827aUL,
+ 0x4d7f0b5bUL, 0xe1d5aa43UL, 0x350806acUL, 0x8d73c65eUL, 0xa3df2605UL, 0x60102518UL, 0x392d026aUL, 0x27f5c207UL,
+ 0xa7fe4ebdUL, 0xf320363bUL, 0x7d88eea5UL, 0x391167f2UL, 0x6f19cffUL, 0xac246b4cUL, 0x47f71be0UL, 0x3d13320eUL,
+ 0x68d313f5UL, 0x6894d358UL, 0xa18a28f7UL, 0xba9176f8UL, 0xb1499493UL, 0xb56afc5cUL, 0x35f92bc5UL, 0x1b0c009eUL,
+ 0xa66936d0UL, 0x295dfc7aUL, 0x15ca2293UL, 0x9c398829UL, 0xa66f62fcUL, 0x6f348fd0UL, 0x578ab499UL, 0xc52a71fbUL,
+ 0x881c088fUL, 0x1d518b58UL, 0x4a5e827dUL, 0xcacc201dUL, 0x54d343baUL, 0x75e9c3deUL, 0x8939f614UL, 0xda26ac8dUL,
+ 0xbf6090dUL, 0xf38b25d0UL, 0xc0bece98UL, 0x238f61ffUL, 0x8e8f5a07UL, 0xc0cf8e60UL, 0x3d7de0efUL, 0xf5d07ce8UL,
+ 0x372673d8UL, 0x9db6c787UL, 0xc015e3f8UL, 0xa731024cUL, 0x7037b5c4UL, 0x62e85aecUL, 0x39761a69UL, 0x8093a4UL,
+ 0x1554f5f3UL, 0xcc21316bUL, 0xcca25b33UL, 0xa9238a6UL, 0xd52018a7UL, 0x65da77b5UL, 0xf0791ba6UL, 0x68b8396bUL,
+ 0x7277fbfUL, 0xc60a1d28UL, 0x9bcd007fUL, 0x89c085d1UL, 0x90eae401UL, 0x52bad43cUL, 0x6b061837UL, 0x57ea1411UL,
+ 0xd22810c3UL, 0x1522b0dfUL, 0xf1dd9d98UL, 0xa2cff1c0UL, 0x22d01631UL, 0x58c38804UL, 0x95cdb229UL, 0x23530615UL,
+ 0x248e3be4UL, 0x60a08e34UL, 0x7ab5114bUL, 0x4ec8ab38UL, 0xc1e49bc5UL, 0xbedca11bUL, 0x6dbf7d58UL, 0x5ef3b49aUL,
+ 0x6af30cf5UL, 0x32347d6fUL, 0x67a59ed3UL, 0x71edf0e1UL, 0x6aad84b1UL, 0x90770858UL, 0x61aeb014UL, 0x7e23f8ffUL,
+ 0xa031ed91UL, 0x1c5b6c3cUL, 0x7da66137UL, 0x4ddad93cUL, 0xd18bbe29UL, 0x9376fac9UL, 0xd8f6235aUL, 0xc8ec4f90UL,
+ 0x6ed64ea5UL, 0x323a5c57UL, 0xfcf924afUL, 0x511f205dUL, 0xae530cfcUL, 0xa4d79d9bUL, 0xc80edc04UL, 0xe78119b8UL,
+ 0xdb1182eeUL, 0xbe7c3955UL, 0x1f718b00UL, 0xbeacd477UL, 0x7e5fa1cdUL, 0x13a4577bUL, 0x21c1a8aaUL, 0x5241dfe6UL,
+ 0xd3cdd8deUL, 0x4f68efefUL, 0x91d65ee7UL, 0x8d33af8dUL, 0x2b13b0e3UL, 0x5e4dbf70UL, 0xa1859ee4UL, 0xd5bf88c0UL,
+ 0x71f42233UL, 0x287733d5UL, 0x7e89a98fUL, 0x3832769eUL, 0x2ba79704UL, 0x3910d2e3UL, 0x43d9193eUL, 0x742bdf14UL,
+ 0x56346056UL, 0xb96cb1f6UL, 0x7fae7295UL, 0x26be10dfUL, 0x22d768e1UL, 0x72171af5UL, 0xaed78dd8UL, 0x38ea1455UL,
+ 0x9e74127fUL, 0x481b53acUL, 0x4cbfcda3UL, 0x43cdbe51UL, 0x76b5473dUL, 0xa3e405d9UL, 0x473d060cUL, 0x6499b0a8UL,
+ 0x57d0c104UL, 0xa1425617UL, 0x2e1c8655UL, 0xbb1482d2UL, 0xf2985637UL, 0x189eb552UL, 0xf8b95331UL, 0xeb21280cUL,
+ 0xb665394UL, 0xbd2715a5UL, 0x82cd01dcUL, 0xf73ac570UL, 0x74ac6312UL, 0x2f843a9dUL, 0x559ec9aUL, 0x192d3f18UL,
+ 0xf7c32d5dUL, 0x5b50dd72UL, 0xe9ac1ad1UL, 0xf506655UL, 0xab354574UL, 0x2e1757eeUL, 0xeb048edaUL, 0xd7c37c2cUL,
+ 0xd700d53fUL, 0x831cb8d1UL, 0xee17bd42UL, 0x5a36dbb7UL, 0x6784ee79UL, 0x3a25ea1cUL, 0xa1a6527UL, 0xcc155fb0UL,
+ 0xe3c04b6dUL, 0x43d0e44UL, 0x348052d1UL, 0xe71b2c14UL, 0x4a454658UL, 0x11c0b41dUL, 0x4568c18fUL, 0xba10e712UL,
+ 0xb516b9eeUL, 0xb65aa1f2UL, 0x34c1722UL, 0xd36a0d58UL, 0x1fae8083UL, 0x4b1e76fUL, 0x8c5ac32fUL, 0x556600e9UL,
+ 0x406c91eaUL, 0x2385c29UL, 0xf8f83df3UL, 0x8d1be994UL, 0x73af81a8UL, 0xb611d5cUL, 0x521b69bUL, 0x104e78b7UL,
+ 0x8f786742UL, 0xeb6c68f5UL, 0x2d292468UL, 0x8289c456UL, 0xad5889c6UL, 0x85068f08UL, 0x5dc3c492UL, 0xc9633321UL,
+ 0xe5da05d5UL, 0xaf26a947UL, 0x79ea1cbUL, 0x86a613f9UL, 0xbd82901UL, 0x3c45c273UL, 0xee6bace3UL, 0x5b056cc7UL,
+ 0xa4783912UL, 0x1699f504UL, 0x44adc5f4UL, 0xe069ea8dUL, 0xb87056abUL, 0x3fc555afUL, 0xe1572f02UL, 0x65ab3b1dUL,
+ 0x1338a1eeUL, 0x32c7f36cUL, 0x8027665fUL, 0xb35f3116UL, 0x497f9604UL, 0x17fe433eUL, 0x91cf4989UL, 0x8cbfda64UL,
+ 0xada8df2eUL, 0x441637f1UL, 0xaceb9bb3UL, 0x4ddce237UL, 0xdbcd1c4dUL, 0x30d13538UL, 0x317dc19fUL, 0xa9055bd8UL,
+ 0x2b05d6e1UL, 0xca6f0928UL, 0x8ee772a2UL, 0x562dc168UL, 0x4c7ed5a7UL, 0x39bb9545UL, 0x63e586bUL, 0x9d383542UL,
+ 0x648203e9UL, 0xa0182a5cUL, 0x79331d85UL, 0xa2ec5452UL, 0xfbcd0680UL, 0xac0be273UL, 0x87678e1UL, 0x6dd077a8UL,
+ 0xe2674740UL, 0x77e31a63UL, 0x7d2d8542UL, 0x525914adUL, 0x75da67a3UL, 0x929975c3UL, 0xefaf6737UL, 0xf7041870UL,
+ 0x2aba3eb9UL, 0xff770419UL, 0xc88df89cUL, 0x2c09ba21UL, 0xcc064b4UL, 0xfef127f5UL, 0xd428d481UL, 0x648eb55bUL,
+ 0xa7981be6UL, 0xf4855266UL, 0x85afda3fUL, 0xc1e84f6eUL, 0xd618542bUL, 0x68251db7UL, 0x47dec31dUL, 0x5aef78d1UL,
+ 0xfd7ebedbUL, 0x394b92cUL, 0x5884d41bUL, 0x2cb24bfdUL, 0x49eff22eUL, 0xd2c9abcdUL, 0x22bd081UL, 0xe3dbd661UL,
+ 0xbf5de954UL, 0xc989730dUL, 0xae77267eUL, 0x7e7011b1UL, 0xb83a221fUL, 0xaadc9a07UL, 0xaed4f86dUL, 0x6cd0679UL,
+ 0xa041c5c1UL, 0xa6772e1fUL, 0xc0ca7551UL, 0xa16b443UL, 0x736b9537UL, 0x44f4cf0UL, 0xc54c1c15UL, 0x922994dbUL,
+ 0xe2a88f1aUL, 0xc9b740f6UL, 0x1063525UL, 0x3d993ea1UL, 0x8c847aaUL, 0x385df5e9UL, 0x3f718395UL, 0xf81f1bffUL,
+ 0x94cefda8UL, 0x43d3e1dcUL, 0x11325c7UL, 0x8d42f456UL, 0xcbd3e93fUL, 0xf71fafa3UL, 0x96156605UL, 0x90dd43efUL,
+ 0x3302ed4UL, 0x2d8723a0UL, 0x83b4a143UL, 0x7aab2f63UL, 0x3c01d04aUL, 0xa3c3b377UL, 0xd63ec6caUL, 0x1daae350UL,
+ 0x11408e15UL, 0xbe790b2fUL, 0x3aac594cUL, 0x67ac1a78UL, 0x2f801c0dUL, 0x71a7a958UL, 0xcef1a325UL, 0x29b5e06aUL,
+ 0xb267365cUL, 0xcf1b65f9UL, 0x8fff3cf6UL, 0xd0c80fd6UL, 0x632be4f0UL, 0x7a31ed66UL, 0x167a715fUL, 0xa37cefa2UL,
+ 0xc3f5c4a4UL, 0x1e206930UL, 0x6207853cUL, 0x9f34db87UL, 0xc3ad97f8UL, 0x352d52fUL, 0x3cd64f2UL, 0xf9448892UL,
+ 0x170e2b4UL, 0xc15298fbUL, 0xcdd0788UL, 0xef056571UL, 0x1dbbf9cUL, 0x99514992UL, 0x713005c1UL, 0xdc1fd831UL,
+ 0x8c9294dbUL, 0x9022c8e1UL, 0x4f2a1bbdUL, 0x37b30651UL, 0x47340c33UL, 0x3ce0a33eUL, 0xc46c0767UL, 0xcc69d28dUL,
+ 0x912e9cd0UL, 0x86dada2fUL, 0x798efa41UL, 0x74d674adUL, 0x6421253eUL, 0x6ee731b1UL, 0x57c10ac1UL, 0x6b20f00fUL,
+ 0x4ee6c468UL, 0x1787667bUL, 0x2e298fa6UL, 0xeef6f23aUL, 0xedc129UL, 0x948330aUL, 0xfa9ba327UL, 0x42c77b9aUL,
+ 0x48bc9a64UL, 0xf2b704e5UL, 0xb69581a7UL, 0xb9003f3cUL, 0x3867c148UL, 0x3f8725beUL, 0xdb44d8c5UL, 0x6a7ad4d8UL,
+ 0xda7023e8UL, 0x1931ecf0UL, 0xe6e84ea5UL, 0x646bb448UL, 0x71756f4bUL, 0xf13019e9UL, 0x2f4d26cdUL, 0xb9ce095dUL,
+ 0xebcbf3feUL, 0x1da28ed0UL, 0xdf573583UL, 0x162077f7UL, 0x46b96d84UL, 0x73ace555UL, 0xce80821bUL, 0x7ea66628UL,
+ 0xbe6271b7UL, 0x6280076bUL, 0x179ed4a3UL, 0x833ac087UL, 0x5a1d1325UL, 0xc681f79bUL, 0x5e0f4c8cUL, 0x5bac73bUL,
+ 0x10b56425UL, 0x9f6a1c42UL, 0xc9c3e331UL, 0xa41fd086UL, 0x1849acbfUL, 0xb606e877UL, 0x85e33518UL, 0xfd47da83UL,
+ 0x50663cf0UL, 0x11c8a057UL, 0xf926b382UL, 0xd7e988c3UL, 0xf0b94037UL, 0x526a6daeUL, 0x13f772ddUL, 0x4dcc7d68UL,
+ 0x1d6d1e7bUL, 0xd8988389UL, 0xc071c703UL, 0x8837454dUL, 0x609ffd91UL, 0xb64d32c2UL, 0x1d104f4aUL, 0x54719b1bUL,
+ 0x46ad5cceUL, 0xb9f2ac09UL, 0x813cd677UL, 0xafa29370UL, 0xde7fb94eUL, 0x649b8625UL, 0xc5f19a70UL, 0x286efd9eUL,
+ 0xf8a4bfa1UL, 0x1911c573UL, 0xfd48ea3aUL, 0x2e62c5f8UL, 0x2441688dUL, 0x6b0cfb91UL, 0x3834a07bUL, 0x9a12b839UL,
+ 0x407619f3UL, 0xc0e52fe7UL, 0x202c3cb7UL, 0x3b496c76UL, 0x1ed7fccbUL, 0x990afc84UL, 0x6eaeac06UL, 0x3a80c96eUL,
+ 0x8ef56ac6UL, 0x6b2f3bf7UL, 0xcb2a1c47UL, 0xd09032eeUL, 0x434eee89UL, 0xbfae01ceUL, 0xf9b7beb6UL, 0x476dc85cUL,
+ 0xde063b26UL, 0x420fe1b2UL, 0x2b518f5cUL, 0xbe7f807aUL, 0x66902421UL, 0x2b4c391dUL, 0xa20538abUL, 0xef4f7fe6UL,
+ 0x269d5f4cUL, 0xb88f3dacUL, 0xd7fbc3cfUL, 0x891a4925UL, 0x8aa72c0bUL, 0x600feee9UL, 0xd56a11b7UL, 0x753de9a4UL,
+ 0xca8e17cfUL, 0xb191ea09UL, 0x893c6a66UL, 0x8d0dc4d6UL, 0xd03ee874UL, 0x4dcb9adfUL, 0xed3761ffUL, 0x935a6319UL,
+ 0x4ac26c86UL, 0x24c7d22fUL, 0xccd63adcUL, 0xc93a6a24UL, 0xc0263b88UL, 0x9f16a65aUL, 0x5c97394eUL, 0x5bc44784UL,
+ 0x9135c3cbUL, 0x7833c281UL, 0x7e4dc371UL, 0x22afce18UL, 0x6190d8cdUL, 0xffb22594UL, 0xee65030UL, 0x6d88b670UL,
+ 0xd988505cUL, 0xe17b44dfUL, 0x4d1efd59UL, 0xc91719a4UL, 0xafb16c26UL, 0x460ef367UL, 0x7f2d7931UL, 0x5234993fUL,
+ 0x17d3a104UL, 0xca66285UL, 0x4297df4eUL, 0xee570f67UL, 0x1e66923dUL, 0x7391238cUL, 0x637404abUL, 0x277bb41dUL,
+ 0xb71ba5c8UL, 0x3c998202UL, 0x3fe56989UL, 0x13e52937UL, 0x6a96b35aUL, 0xa0aa7dafUL, 0xb77971c8UL, 0xb28a1c32UL,
+ 0xd938ae13UL, 0xd2e2e6f0UL, 0x9a6104ebUL, 0x778496bUL, 0xbcc421e8UL, 0x6de6e21fUL, 0x7701f8faUL, 0x84da6ba4UL,
+ 0xf1b380a1UL, 0x82c4070UL, 0xb1907bccUL, 0x318763bcUL, 0xe85ab7a8UL, 0x7b30d3d7UL, 0x5852e0f2UL, 0xe1d8dfe0UL,
+ 0xd05154dfUL, 0x3f99ccd9UL, 0x5a0bf895UL, 0xc343dbc7UL, 0x9fc0a367UL, 0x219497aaUL, 0xe240cce1UL, 0x4e94fb0UL,
+ 0x51fc714fUL, 0x8a76b1ebUL, 0x4571ab1dUL, 0xd939fd97UL, 0xe4cb9a53UL, 0xcb401fb4UL, 0xdb82f94eUL, 0x92180da3UL,
+ 0x2ec9d29bUL, 0x9edc365dUL, 0xc8db8ed9UL, 0x25879375UL, 0x2e8284fdUL, 0xa2da7528UL, 0xac9f525eUL, 0xcdc55f8cUL,
+ 0x2d429589UL, 0xa3f2b3b2UL, 0x846c5610UL, 0x20cdbedUL, 0xf3b5604dUL, 0xcbb149aUL, 0x4f178a42UL, 0x3b2ead9cUL,
+ 0x5133b55fUL, 0x6647f329UL, 0x47814c65UL, 0x8f9d7118UL, 0xf1fc399bUL, 0xbb5a395bUL, 0xcffcaa00UL, 0x2c9ba27UL,
+ 0xa85896d9UL, 0x73c4a7d3UL, 0xe93382c6UL, 0x4b16daa8UL, 0x555f85b7UL, 0xf03de5b1UL, 0x1b2ed31fUL, 0xb58d6c5aUL,
+ 0x2e730b1cUL, 0x4a20cc96UL, 0x983829e8UL, 0x5dacf6afUL, 0xb401199aUL, 0x2d6de765UL, 0x76d1bd75UL, 0xfbf352f1UL,
+ 0xb10470f3UL, 0xbc564aa8UL, 0xd9073c8fUL, 0x9630f290UL, 0x4012e677UL, 0x1b889039UL, 0x10b15d0fUL, 0xbe066f18UL,
+ 0x904b4dd4UL, 0x2c64274fUL, 0x52ba42e9UL, 0x3205258UL, 0x7b08eb95UL, 0x8fadd1ecUL, 0x5b620cf7UL, 0x289a8ef4UL,
+ 0x1871ae62UL, 0xebc65a4bUL, 0x3e2741a7UL, 0x203d3400UL, 0xb4f76efUL, 0xa3709326UL, 0xda975a67UL, 0x3802bbd0UL,
+ 0x1fb43666UL, 0xb363ec40UL, 0x11bbed57UL, 0xbbadc1a6UL, 0x722e230fUL, 0x6f343c2aUL, 0xfe784270UL, 0x1ceb6ddbUL,
+ 0xc414651aUL, 0xe64c49e5UL, 0x511c86d7UL, 0x960d84f9UL, 0x262cded6UL, 0xb866c30eUL, 0xe431780fUL, 0x16535b2cUL,
+ 0xb902e91cUL, 0x673b6581UL, 0xccbb37ddUL, 0x938557d6UL, 0xc4af6932UL, 0x387186b2UL, 0xa8f2cf7UL, 0x32bdd3a3UL,
+ 0x1736ee06UL, 0x7e7cf6c5UL, 0x2367e43dUL, 0xe2cfd1a3UL, 0x1a304ffbUL, 0x94e4fbeUL, 0x4d4bd934UL, 0xb7ff1cfbUL,
+ 0x3d2f1cdeUL, 0x693886a7UL, 0x3eda9f97UL, 0x3ebe864UL, 0xd8a81e5UL, 0xc774d9faUL, 0x505a6432UL, 0x66100e99UL,
+ 0x5c0253aUL, 0xf61dd143UL, 0x2ff0064bUL, 0xca3f3b2dUL, 0x918733ffUL, 0x8bc141ccUL, 0x6196011cUL, 0xcbf6c9cfUL,
+ 0x57c6ebebUL, 0x18704e04UL, 0x58610519UL, 0x62231ad2UL, 0xa7b98d0UL, 0xe32d21d6UL, 0xbbbb4ae1UL, 0x2056c9cUL,
+ 0x7a3f20b2UL, 0x52ef36fUL, 0x174f636UL, 0xa01df9d4UL, 0xafdd827cUL, 0xf54e9505UL, 0xe715531dUL, 0x78cca28aUL,
+ 0x9446fef4UL, 0x6ecacdcfUL, 0x102d982cUL, 0xaf977d07UL, 0x71dd4affUL, 0x87565f09UL, 0xa9d0241dUL, 0x1ffa1a67UL,
+ 0x6a526b79UL, 0x64167b0dUL, 0x26e10d89UL, 0x6043a261UL, 0x412903d7UL, 0x87dd0399UL, 0x8edca4f0UL, 0x598778a0UL,
+ 0x442db0b2UL, 0xdd0224fdUL, 0xadee8115UL, 0x585f59eeUL, 0x694a24fUL, 0x2e8b9bc6UL, 0xf54b89e4UL, 0x31031a19UL,
+ 0xbf8b01f8UL, 0x941d6f4fUL, 0xebc690cbUL, 0x1f27a852UL, 0x67a6f55fUL, 0xcc596a6aUL, 0x9defe917UL, 0x9d504659UL,
+ 0x604aae35UL, 0xa7d343dcUL, 0x197b335cUL, 0x1b954036UL, 0xab00cf5bUL, 0xfd8d5300UL, 0x11cd8b90UL, 0x7987ee0UL,
+ 0x5bb98937UL, 0x373e340bUL, 0x13002e67UL, 0x6a3e20ddUL, 0x4204d70dUL, 0x22f2c2c2UL, 0x954a116UL, 0x1c5ea50cUL,
+ 0xb16fef03UL, 0x1d8dbec3UL, 0x5483a5fUL, 0x2c158f73UL, 0x628f56fcUL, 0x73b00b40UL, 0x9d0950caUL, 0x9a1e40c9UL,
+ 0xe483a578UL, 0xac3ee162UL, 0xcecb44c1UL, 0xb0ffa5e4UL, 0xfe42458aUL, 0x851fc97fUL, 0x8e173dc4UL, 0x698fc630UL,
+ 0x9e2fad83UL, 0x79389b48UL, 0x27af0878UL, 0x34171eceUL, 0xa5c85706UL, 0x52db6e41UL, 0x67659d8aUL, 0xac4ced9cUL,
+ 0x9e879675UL, 0x77156c66UL, 0x90253ccUL, 0x8c0a1d26UL, 0xc6dfac1bUL, 0x2defd603UL, 0xdac30572UL, 0xe4d5922fUL,
+ 0xc841fc69UL, 0x3a2d25fcUL, 0x1704ddd7UL, 0x4c564863UL, 0x5ed422d7UL, 0x8953a6dbUL, 0x7201ea16UL, 0x925a7d52UL,
+ 0x98580649UL, 0xc19e2203UL, 0x79862d18UL, 0xb8b190b0UL, 0x7f52afe3UL, 0xa5ed4c0eUL, 0x605da072UL, 0x3a379a6dUL,
+ 0xa023ae9UL, 0xea9a1fdUL, 0xaee879e7UL, 0x24ec3295UL, 0xa3c32a3eUL, 0xcc921d3bUL, 0x7cfbb85bUL, 0x7dd731fdUL,
+ 0xec6fe3bUL, 0x5cd4ba8fUL, 0xdf6e5e54UL, 0x44f71d92UL, 0x64f90e4aUL, 0x66cd8d4aUL, 0x1e1179bUL, 0x23460473UL,
+ 0x98705938UL, 0x11137e0dUL, 0xc1cd99b5UL, 0x403ea9e5UL, 0x66c8d0e6UL, 0xfce9fb7cUL, 0xb24b64b0UL, 0x2bd29d1aUL,
+ 0x32460ec2UL, 0xfb7a35d0UL, 0xda5c6e2eUL, 0xc674d6dcUL, 0xce3dc762UL, 0xda1e18d0UL, 0x4495fd48UL, 0x31ca844UL,
+ 0xc3c1f1a8UL, 0xef9a82f1UL, 0x2eec08d4UL, 0x6585efd0UL, 0xc644783cUL, 0x16eabe49UL, 0x50217af5UL, 0x5b8d8e51UL,
+ 0x4f58b6afUL, 0x81c2b6e1UL, 0xd126d27fUL, 0xea72c275UL, 0x864c85ccUL, 0x7261d435UL, 0x7aa2eed6UL, 0x397d68f9UL,
+ 0xa47c662fUL, 0xb8300aa3UL, 0xbc23fc6fUL, 0xc31d91f8UL, 0xa3f7ebd2UL, 0xb2d01d6fUL, 0xc6eb8fa9UL, 0x9bd4a978UL,
+ 0x1d64a985UL, 0x4ab4d86UL, 0x95e84277UL, 0x71021ea7UL, 0xd32a6c5UL, 0xe43651bdUL, 0xa80c1a3UL, 0x8866eff9UL,
+ 0xc06d545dUL, 0x4bb041eeUL, 0x73a4c8a7UL, 0x1ea9c814UL, 0x653d01e0UL, 0x4cf5d704UL, 0x701290cbUL, 0x7f69e34UL,
+ 0x554053eeUL, 0xab394e70UL, 0x3b719c9fUL, 0x5baba9e4UL, 0x6c7c925cUL, 0xe64bed9bUL, 0xb227a217UL, 0xa25f4d9eUL,
+ 0xffdd0ad0UL, 0x253b1a05UL, 0x61638847UL, 0x195cbfe4UL, 0x61dc26b0UL, 0x80c28a99UL, 0x3a8860beUL, 0x5e474f2cUL,
+ 0x2c708a52UL, 0x8baa3be6UL, 0x30371816UL, 0xd9881967UL, 0xb12e3f2bUL, 0x53b93e81UL, 0xcc7961aaUL, 0x93663b93UL,
+ 0x1fcc7b4bUL, 0x908175feUL, 0x296c858eUL, 0xef925fd0UL, 0xe3d50e3dUL, 0x1866517dUL, 0x60eb815UL, 0xe9179fc0UL,
+ 0x64a01a0cUL, 0xe281b1cbUL, 0x2edde431UL, 0xeab27dc7UL, 0x4df29095UL, 0x8e7dbdc9UL, 0xa992c95dUL, 0x8697a9f8UL,
+ 0x1b9226ecUL, 0xc7828e98UL, 0xe5864873UL, 0x1d8102c2UL, 0x7413b10eUL, 0x4aa466e0UL, 0x3578d5deUL, 0xb015e575UL,
+ 0x3476b2b4UL, 0xcf444315UL, 0x832ff2e4UL, 0x2a4d48abUL, 0xf7ae5d99UL, 0xcf04ec2fUL, 0xf7265d6UL, 0x146f6b2eUL,
+ 0x635886efUL, 0x65a03392UL, 0x680754d8UL, 0x3c16142aUL, 0x2f394107UL, 0x324317d5UL, 0xf41e35c7UL, 0xf38dc3f0UL,
+ 0xea0c088UL, 0xca4cb3ccUL, 0x4dbb9353UL, 0x6d24fdb0UL, 0x41fa237UL, 0x777b42b2UL, 0xdc07a0f1UL, 0x1698e9d2UL,
+ 0x82cb7c2aUL, 0x124a1b7UL, 0x5c0e2fffUL, 0x8e7f0cd8UL, 0x196ca195UL, 0x1fcd8004UL, 0x61cbade9UL, 0xdae1d10bUL,
+ 0xb3f7085aUL, 0xc047b035UL, 0x73d23c69UL, 0xbd2f799UL, 0xc5282485UL, 0xd70a16bfUL, 0x94f935c5UL, 0x707ed9fbUL,
+ 0xbe4b9588UL, 0xadf663cUL, 0x2c2bbe3cUL, 0x41f067daUL, 0xf261bf1cUL, 0xba01b707UL, 0x7c15ffe0UL, 0xc3e99b43UL,
+ 0xa8249b0cUL, 0x30fcb226UL, 0xc3e312f7UL, 0xb2b5a2d3UL, 0xbdcd8aaUL, 0x6442aa95UL, 0xdeecd1e6UL, 0x51291a7bUL,
+ 0xc68873f9UL, 0xb23cef72UL, 0x34eb10ccUL, 0x5631bfebUL, 0x1f5c8fa3UL, 0x5c00b3c5UL, 0xfd64e5b0UL, 0xf8ee5c78UL,
+ 0xca94fa98UL, 0x5183aa92UL, 0x905ba579UL, 0xf654f206UL, 0x8242e4beUL, 0x260dce29UL, 0xc0ff0d08UL, 0x56199cb4UL,
+ 0xb3f39394UL, 0x9dfd4fbeUL, 0x9d76b25cUL, 0x9d30c32dUL, 0x132c40d9UL, 0xfbccd3f4UL, 0x19d39c4fUL, 0x8509d15cUL,
+ 0x5b8b2bbbUL, 0xf1e5e78eUL, 0xd80213f6UL, 0x59290070UL, 0x3b3cd0c0UL, 0x6c742cfbUL, 0x21ff2764UL, 0x21f5200UL,
+ 0xf64a0df8UL, 0xaf7cc32fUL, 0xf4078c2bUL, 0x3b7ba225UL, 0xc07cd6d4UL, 0x1e0287d0UL, 0x46d20c52UL, 0x83848676UL,
+ 0xd6a27543UL, 0xdb9b7485UL, 0xb0f93b77UL, 0x307cebebUL, 0x27eb5143UL, 0x1b4088dbUL, 0x86e8373eUL, 0x27e32e72UL,
+ 0xb1cc67b4UL, 0xbe5319c6UL, 0xef5cc9e6UL, 0xa8d89145UL, 0xb9cdf43aUL, 0x708c2e59UL, 0x12e97dc9UL, 0x7ccb12faUL,
+ 0x3439d1ddUL, 0xe66925f3UL, 0x3ea861f2UL, 0x831788eaUL, 0x5b4d1cdcUL, 0xe0a64785UL, 0x9805f0e1UL, 0xbd10424bUL,
+ 0x960d7babUL, 0x21f8443UL, 0xe79077b5UL, 0xb795672aUL, 0xbe034f78UL, 0x9a4ab29eUL, 0xdca7a900UL, 0x74120916UL,
+ 0x25e99c82UL, 0xa5936847UL, 0xa13e6ff4UL, 0xd0f77ae5UL, 0x355e2c48UL, 0xeabc8943UL, 0x9c862c78UL, 0xe4f32620UL,
+ 0x47b19d08UL, 0x26cea6b0UL, 0x809d75b9UL, 0xef0edd0cUL, 0xf3889be5UL, 0xbfc77ac0UL, 0x6cd4ffbaUL, 0xf2a4f7b8UL,
+ 0xaab10548UL, 0x38ac34f5UL, 0x1739c4cbUL, 0xaed5a1ddUL, 0xe2af0c21UL, 0xf13ad226UL, 0x5f31281UL, 0x1b27a070UL,
+ 0x19fcfb93UL, 0xf1c53e88UL, 0x413d82caUL, 0x935d8a86UL, 0xf44f066eUL, 0x881fa95eUL, 0x6b5181a7UL, 0x222a860dUL,
+ 0xd1a74809UL, 0x7d61f9faUL, 0xecd0b2c7UL, 0x8ba19fb1UL, 0x4affc79fUL, 0x40d6b73cUL, 0xb24615e8UL, 0xdbfed5a0UL,
+ 0xe3708408UL, 0xc2ced5b7UL, 0x6ae30298UL, 0x229551a4UL, 0x5fbe78efUL, 0x61bf40deUL, 0x41717b88UL, 0x15187625UL,
+ 0xbf8efbf4UL, 0x2ae81617UL, 0x6a55a5b0UL, 0xd62b7b0cUL, 0x28f821acUL, 0xae198cbaUL, 0xff2714ffUL, 0x3c7fa9f2UL,
+ 0xa0422a73UL, 0x7a42715UL, 0xb751592fUL, 0x7464763cUL, 0x6fa0d05dUL, 0xf63eac36UL, 0xe24f0b1cUL, 0x59bc4909UL,
+ 0x3a36511aUL, 0x5fd92ccaUL, 0x58018f66UL, 0x1b24c901UL, 0xefce4cf2UL, 0x2d04548eUL, 0xa96d41b4UL, 0x80c26d8aUL,
+ 0xd349cc1bUL, 0x2876119dUL, 0xf83a646aUL, 0x984bb3a8UL, 0x583c34e1UL, 0x57a88f1bUL, 0x2e96c4c9UL, 0x6e0d9423UL,
+ 0xe68e63fbUL, 0x5d5ba962UL, 0x73de0176UL, 0x50b9e40eUL, 0xf3a25bc9UL, 0xa6d59bd6UL, 0xbae35218UL, 0x2b0e4355UL,
+ 0x3e17107eUL, 0x8c12021dUL, 0xdda7abbfUL, 0x8a01b66fUL, 0xcb8c0a2aUL, 0xa6cac52aUL, 0xe5091918UL, 0x713ebe61UL,
+ 0x3200d264UL, 0xd1caa9d3UL, 0xd3b57051UL, 0xc8728885UL, 0x82559c7UL, 0x3acaea3eUL, 0xf3e6b406UL, 0xae7b734dUL,
+ 0xe11827e3UL, 0xc4c3eUL, 0x9f9c13f4UL, 0x8cae11efUL, 0xbec73fb0UL, 0xc6d5417cUL, 0x99e7d83fUL, 0xfb3c42e0UL,
+ 0x2f134b3dUL, 0x12879484UL, 0xebaec0f9UL, 0x2c2c61a6UL, 0xef835717UL, 0x84833f4fUL, 0x733febf7UL, 0x89c87136UL,
+ 0xa39030a3UL, 0x5ee814c1UL, 0xafc08ba9UL, 0xff9ba5b9UL, 0x49916579UL, 0x7f790d00UL, 0x54279ad7UL, 0xc0cf4f18UL,
+ 0x74b75a35UL, 0x3e698d17UL, 0x2e876397UL, 0x60c260b3UL, 0x747da2b4UL, 0xfcbe39c8UL, 0xce230d20UL, 0x713b975aUL,
+ 0x9593731cUL, 0x8849f26dUL, 0x621417f2UL, 0xd55f715UL, 0xfa3da79aUL, 0x6bd04b07UL, 0xa83c1dbeUL, 0x1c005425UL,
+ 0xde2c1cfcUL, 0x46f3603bUL, 0xf4ba626UL, 0x5a1df7afUL, 0x29a35e1eUL, 0xc2f382aUL, 0x3ebf41d6UL, 0x6e683be3UL,
+ 0x1c306298UL, 0x95b1ed2fUL, 0x1a7293dcUL, 0x4d4ac375UL, 0xaa3daadbUL, 0x6b1ff603UL, 0x414359f7UL, 0x38184a79UL,
+ 0x1e04f69eUL, 0xaf611120UL, 0x73bc2b6cUL, 0x3d86aa8aUL, 0xdbb2a309UL, 0xc50046d6UL, 0x2bf73e46UL, 0xb7a1997fUL,
+ 0x37984e7UL, 0xa4090ed1UL, 0x205766c9UL, 0x5ae78077UL, 0xf1e87595UL, 0x128b33c5UL, 0xd40d04d8UL, 0x7bb67c6eUL,
+ 0xf9b7b8a8UL, 0x28246199UL, 0x49afefa7UL, 0x721cfd9cUL, 0x592130f2UL, 0x2c3f533dUL, 0x357b13d7UL, 0x79f55bdcUL,
+ 0x28bf5cbbUL, 0xd1c65591UL, 0x8a199e44UL, 0xcf7d5c7fUL, 0xad7d6cedUL, 0xb202a0caUL, 0x9a1082b3UL, 0x402711fdUL,
+ 0xf0df5249UL, 0x37c7a421UL, 0x166405a4UL, 0x7d72bef4UL, 0x7dc0024eUL, 0xb5b4c07bUL, 0xfefd6624UL, 0x85426511UL,
+ 0xb9559622UL, 0xdef72b8aUL, 0xdce577a9UL, 0x8dfdd4bcUL, 0x6be61c1dUL, 0x93769b93UL, 0xa7feb61eUL, 0xd8a16dedUL,
+ 0xea5035c2UL, 0x3321d959UL, 0xdcef258cUL, 0xa30b8e37UL, 0x9ddff9f3UL, 0x86c0d243UL, 0x40ec8906UL, 0xfe410f96UL,
+ 0x98e3888fUL, 0x332c9b79UL, 0xe6595afaUL, 0x4b5181b7UL, 0x1d9564f3UL, 0x71b88e1dUL, 0x2d3e24f6UL, 0x5ac7bf7dUL,
+ 0xaa39cadeUL, 0x1b904766UL, 0xb26ae73eUL, 0x3532570UL, 0x3bdef30fUL, 0x94c46c84UL, 0x24f87e1UL, 0x80d07a75UL,
+ 0x51febccbUL, 0x2b9eb1fcUL, 0xa0eafcfbUL, 0x4b269d8bUL, 0xa5a078e9UL, 0xb756e5aUL, 0xd08781f3UL, 0x98d3570dUL,
+ 0xc957fbfeUL, 0xf46cbcceUL, 0x14e4c6bcUL, 0x5c22b7faUL, 0x58bb4acfUL, 0x47149b7cUL, 0xf62146c5UL, 0xfa386495UL,
+ 0x561f0c5UL, 0x38f28834UL, 0x69ac5e67UL, 0x21acf0acUL, 0xfb7decdcUL, 0xd7d99c59UL, 0x371fe322UL, 0xdcfc6eb9UL,
+ 0x47f585a1UL, 0xc5608f8cUL, 0x40e5f846UL, 0x198669ebUL, 0xaee303c0UL, 0x894e9219UL, 0x63418c73UL, 0x55a9ad2aUL,
+ 0xcdf82d6bUL, 0x72f66004UL, 0x4cc1ca9dUL, 0x477ee668UL, 0x5d152b27UL, 0x49fab142UL, 0x689b7f0UL, 0xe19bb4daUL,
+ 0x9854a2a0UL, 0xc4b8a970UL, 0x2792daddUL, 0xb1b7ec27UL, 0x221e33fUL, 0xdad5f3ceUL, 0x21ed563bUL, 0x1a7accdcUL,
+ 0x6e3600abUL, 0x1a2ade59UL, 0xa6107339UL, 0xe9bccd9dUL, 0xff712630UL, 0x8fce98abUL, 0xe7d7f6ebUL, 0xda9aec6aUL,
+ 0xe494bf4cUL, 0x356da6c8UL, 0xa02e3ee7UL, 0x38096af5UL, 0x2c57a810UL, 0x1a2330daUL, 0xf9a64534UL, 0xb6c86208UL,
+ 0xd13f28abUL, 0x1eb74103UL, 0xe0314fafUL, 0x6a949ad6UL, 0xc906e5a7UL, 0x9de1fe4eUL, 0x671731dbUL, 0x8818326bUL,
+ 0x87b86800UL, 0xea1c2985UL, 0xcfe5a208UL, 0x156c403dUL, 0xef11eb44UL, 0xc031ff92UL, 0x686c7d6aUL, 0xc17b5c75UL,
+ 0x799e9954UL, 0x77100ff2UL, 0x17513f39UL, 0xe56c4bb0UL, 0xef94d543UL, 0xb942284aUL, 0x9ad637e5UL, 0x3ade2416UL,
+ 0x417b0f22UL, 0x1960dc40UL, 0x998e8a13UL, 0x9ec604deUL, 0xcc4b0618UL, 0x8139c535UL, 0x4d5ca455UL, 0xe2a98bd8UL,
+ 0xe0226e82UL, 0xf83391acUL, 0x1e4720b8UL, 0xc8976979UL, 0xeff2e609UL, 0xcfc17e42UL, 0x2497e701UL, 0x28af1a60UL,
+ 0xefe96c23UL, 0xc0308caaUL, 0x6f06d696UL, 0x200ed141UL, 0x3846158aUL, 0x603e468dUL, 0x7b6e8b79UL, 0x18f25011UL,
+ 0x28bd767cUL, 0xb2e2f3c7UL, 0xa2fc4924UL, 0xd1630179UL, 0xf0489f40UL, 0x6e19e31cUL, 0x9502495cUL, 0x3451fbabUL,
+ 0x5ef01d5dUL, 0x77839ce6UL, 0xcecaca6UL, 0x28e943bUL, 0xbb06bca1UL, 0xf7775b83UL, 0xcd9ff14cUL, 0xcef9bc21UL,
+ 0x293a4931UL, 0xe138ffdfUL, 0x90bbc630UL, 0x9c73b4e3UL, 0xf0558018UL, 0x4a53755fUL, 0x2f7c222eUL, 0x4038652cUL,
+ 0xa8b7e183UL, 0x71f92a9cUL, 0x56f8f18aUL, 0x334e180aUL, 0x98af40c7UL, 0x85edf93dUL, 0x602b88f1UL, 0xa4b19414UL,
+ 0x70cb5d96UL, 0xb975b8a5UL, 0x4e37185eUL, 0xdde97e7cUL, 0x4717ad2fUL, 0x1c059652UL, 0x18242a34UL, 0xe9c1887cUL,
+ 0x64770f4UL, 0xc615cdc4UL, 0xa2927482UL, 0x57f93a60UL, 0x4d54b610UL, 0xe2503681UL, 0x56ee2674UL, 0x785c4f74UL,
+ 0x28aa3e71UL, 0x2327c8f7UL, 0x91094ebeUL, 0xa46649d2UL, 0x1c7f8a00UL, 0x47d2adacUL, 0x52dcf845UL, 0xc6b6cfe1UL,
+ 0xc513b821UL, 0xa07ccc3dUL, 0x3c37c8bbUL, 0x3680db43UL, 0xe6f1f1ecUL, 0xd53cb061UL, 0x3a8c48ffUL, 0xa1f56a1fUL,
+ 0x69a8f3d8UL, 0x72dc488fUL, 0xd9e7d22fUL, 0x47ea52dcUL, 0x6589938cUL, 0x317a64afUL, 0xa33bdff9UL, 0xcbc09813UL,
+};
+#else
+static const mp_limb_t ecc_unit[16] = {
+ 0x1UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+};
+static const mp_limb_t ecc_table[4096] = {
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x3UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x5215f2a4UL, 0x89a589cbUL, 0xc235f5b8UL, 0x8028fe5fUL, 0xe3a41e9UL, 0x3d75e6a5UL, 0x4fd036e9UL, 0xdf1626beUL,
+ 0xcbefa921UL, 0x778064fdUL, 0xacf1abc1UL, 0xce5e1c93UL, 0xe25450e6UL, 0xa61b8816UL, 0x7a836ae3UL, 0x7503cfe8UL,
+ 0x1510b33aUL, 0xf09d8973UL, 0x15125d8aUL, 0x59909501UL, 0xf630e13aUL, 0xf29037e7UL, 0xd031d853UL, 0xe5caff31UL,
+ 0x17e3675aUL, 0x5dee8b49UL, 0xc6b5eda2UL, 0x7a956818UL, 0xe30a0b3aUL, 0xc2fdbb0aUL, 0x65445e33UL, 0xfc448915UL,
+ 0x73c034bfUL, 0xbb4b29eaUL, 0x8e23439bUL, 0x74ebb4e8UL, 0xf613096eUL, 0x96594d45UL, 0xc7c4b6dUL, 0x4029ea20UL,
+ 0xf15b4fabUL, 0x4d95af09UL, 0xefa4bc13UL, 0xc96e40c7UL, 0xc2cc8801UL, 0x87323dd1UL, 0xca792c90UL, 0x8cf28a47UL,
+ 0x4b5af16bUL, 0xf143a80eUL, 0xb0ccb6dUL, 0xf1470a8dUL, 0xd383cd2eUL, 0x8c869415UL, 0xb667805cUL, 0x25d30034UL,
+ 0x30136564UL, 0xc3423ee8UL, 0x51adbfe1UL, 0xf9eb2deeUL, 0x5d97a348UL, 0x1704532eUL, 0x94e59114UL, 0x73de4512UL,
+ 0xb91412eaUL, 0x28abff30UL, 0xa89dc402UL, 0xe73a34aeUL, 0x481c3ac6UL, 0x9348baf8UL, 0x5d8a4127UL, 0x153844abUL,
+ 0xe83bccdfUL, 0x9fbd304eUL, 0xd5555f07UL, 0xb9395802UL, 0x9517fc4bUL, 0xaa460afbUL, 0xdc8a2870UL, 0xfc162116UL,
+ 0x50b5a248UL, 0xb34a14d9UL, 0x51c0211dUL, 0x604fc0c8UL, 0x95b488d5UL, 0x391ca41aUL, 0x27292fd3UL, 0x6768a4d6UL,
+ 0xddfb3e54UL, 0xbc9bc22bUL, 0xd34ef1ebUL, 0x3b53bb28UL, 0xfa11b0bUL, 0xf0441f12UL, 0xa2822ea1UL, 0xb6cdd898UL,
+ 0xed50b9e6UL, 0xc494e3e4UL, 0xe8e83d3bUL, 0x7af5f010UL, 0xf9364e92UL, 0x3a9f348aUL, 0x7fc6dc63UL, 0x2852f040UL,
+ 0xc9ed22a1UL, 0xa6a1a672UL, 0x2f019540UL, 0xa2fcd8acUL, 0x6490a5bcUL, 0x5212bcbfUL, 0x716b20e0UL, 0x9dbce605UL,
+ 0x4460739aUL, 0xc7f0d39aUL, 0x87692558UL, 0x40e8cf50UL, 0x5c6ae5f3UL, 0xcfca7a74UL, 0x6c47ec01UL, 0x26b3c4cfUL,
+ 0xede974ddUL, 0x8afdbc42UL, 0x4e76d94dUL, 0x96c9db5bUL, 0x95f4fc72UL, 0xc630f3UL, 0xa1e31127UL, 0x898cc032UL,
+ 0x11bd0be1UL, 0xcd86e1f9UL, 0x1d20680cUL, 0x37df44f4UL, 0xbd9a3d0UL, 0xdcf2a51eUL, 0xe6a96e32UL, 0x1633d5dUL,
+ 0x2b7d1887UL, 0xa4164c03UL, 0x3d8bc5b0UL, 0x29b6ed83UL, 0x87d681caUL, 0x2684d018UL, 0x6b4c34bdUL, 0x13d1f187UL,
+ 0xe107462fUL, 0x874fbaa2UL, 0x417ad828UL, 0xd291f6f6UL, 0xa6fe73f9UL, 0xf8071115UL, 0x3e65fda6UL, 0x3237bf3cUL,
+ 0xcda4281UL, 0x2f227f68UL, 0x87926456UL, 0xa31f2828UL, 0x4af0f970UL, 0x61e3b0b9UL, 0x9a207266UL, 0xf4059f41UL,
+ 0xa80ece81UL, 0xaf26473aUL, 0xfd322c22UL, 0x50f291f7UL, 0xf85b4d31UL, 0xbb706b82UL, 0xb90b101aUL, 0xcb26510bUL,
+ 0xd5844659UL, 0x1b081512UL, 0x77bfaf8eUL, 0x3d0b1c43UL, 0x5e99f600UL, 0x2ea9eab6UL, 0x42ab277dUL, 0x929f168bUL,
+ 0x56dff90cUL, 0xa34e5213UL, 0x7e68d021UL, 0x4c4fe8fcUL, 0x256929d0UL, 0x7510a79UL, 0xddd08e2UL, 0x4858f3feUL,
+ 0xb92f9a5UL, 0x289f5d3eUL, 0xd32e0182UL, 0x46b793d7UL, 0xc1380b77UL, 0xd21a62cbUL, 0xb8acf806UL, 0x5a648ab4UL,
+ 0xfb76bf4dUL, 0xdf9f75d3UL, 0xa65ec6b9UL, 0xf10033afUL, 0x86c7da59UL, 0xf5181499UL, 0x9b8a4edaUL, 0xb39bec8cUL,
+ 0xa1f635abUL, 0x7fb448f5UL, 0xc898d92dUL, 0xf959af99UL, 0xc4098787UL, 0xc3926af6UL, 0xe6d0956UL, 0x26b80fd6UL,
+ 0x3fc60066UL, 0xdb27ffc8UL, 0x44870667UL, 0xacbcbfa4UL, 0x6b242b96UL, 0xbee2f3ebUL, 0xf49f98adUL, 0x394329a3UL,
+ 0x7b4c3678UL, 0x1bad186UL, 0xed8118f0UL, 0x9a8f9a4cUL, 0xe9441e53UL, 0x4a617a3dUL, 0xe22fccfdUL, 0xb2c4d3dUL,
+ 0x22305001UL, 0xdd096289UL, 0xc47b2126UL, 0x7b16bb81UL, 0x1c0a8d75UL, 0xe82f1129UL, 0x71be2e4eUL, 0xc53283d4UL,
+ 0xf3a93b88UL, 0xb6d6bbcbUL, 0xac2156c9UL, 0x73437122UL, 0xded27ca2UL, 0x451809fUL, 0xda9710cUL, 0x9c78e975UL,
+ 0x3e163a09UL, 0xc1515c0cUL, 0x3d3dd15cUL, 0xa006bc7bUL, 0x9cd3afa9UL, 0x13d5c0f5UL, 0x1c26b37fUL, 0x40cc395UL,
+ 0xf1787e7bUL, 0x31d10bd9UL, 0xe83844b4UL, 0x32e246dcUL, 0x27f36bbdUL, 0x4f9aa4eUL, 0x54491750UL, 0xa3323328UL,
+ 0x4c7ef142UL, 0xdd10ae18UL, 0x12218427UL, 0x613293dcUL, 0xd38b6672UL, 0xf30ab39fUL, 0x2c87d470UL, 0xfefdca53UL,
+ 0x6049b855UL, 0x8544dea8UL, 0x367fcb3aUL, 0x1c9699c7UL, 0x9511004bUL, 0x2b1c8524UL, 0x8f51e227UL, 0x5dece850UL,
+ 0xbba69a78UL, 0xe2e63648UL, 0x7c5fa46cUL, 0x83581fa4UL, 0x935378f6UL, 0xce6b680dUL, 0x8974211eUL, 0x56ab6bdUL,
+ 0x79b97ac0UL, 0x2bafe19UL, 0x8d35f156UL, 0x9613bef5UL, 0x17ed213fUL, 0x2e473164UL, 0xae84b639UL, 0xbc801d59UL,
+ 0x9767e068UL, 0x81c96ff7UL, 0xea6c83d5UL, 0xc1c6d2a9UL, 0xd1e3c922UL, 0x173eaf47UL, 0xbc8e01b4UL, 0x8fcebfcaUL,
+ 0x79513d4fUL, 0xf2777c8eUL, 0x192b0788UL, 0x570f674UL, 0x631ba1cbUL, 0x4e5dc57cUL, 0x3cee1b3dUL, 0x49603142UL,
+ 0xf8592903UL, 0xce427a7bUL, 0x5a34add7UL, 0xe61b7d48UL, 0xa0c24dfUL, 0x56724c01UL, 0x2a9bd31fUL, 0x924308d3UL,
+ 0x6f2cf552UL, 0x97c9e8edUL, 0x663cb4cUL, 0x75a30103UL, 0xb4dcee25UL, 0xd861c1eaUL, 0x75fb7c48UL, 0xd11f35c5UL,
+ 0x1200a5c4UL, 0xb861214UL, 0xdc2a83d0UL, 0xb170a13bUL, 0x4ab7bbb5UL, 0x7b3d408bUL, 0xb2a9b3c3UL, 0xb7f3d481UL,
+ 0x8e6f884eUL, 0x7c7d935dUL, 0x5ece3b0UL, 0x9cece57fUL, 0x5fee6870UL, 0x1de77a52UL, 0xfcc968adUL, 0xb6966926UL,
+ 0x239f272fUL, 0x6297cc40UL, 0xb57ee2c1UL, 0x90a425b0UL, 0x83d339d2UL, 0x24be8c2aUL, 0xfeea242aUL, 0x4adc8f4fUL,
+ 0x66c70182UL, 0xcb9dff2eUL, 0x78301bfcUL, 0x18d6a12cUL, 0xada93c85UL, 0x4d012bbfUL, 0x5595c112UL, 0xc19b31eeUL,
+ 0xb1acff2UL, 0x6a16d54eUL, 0x7ffe425dUL, 0x461c37b7UL, 0x73712396UL, 0x89de0435UL, 0xba282909UL, 0x98a1ee58UL,
+ 0x8131eea0UL, 0x90b0e153UL, 0x82ba555bUL, 0x90bcfd18UL, 0xc6c18cccUL, 0xcd86e5f8UL, 0x99fde693UL, 0xf66b402fUL,
+ 0x9ea0266bUL, 0xd980350aUL, 0x9f5402beUL, 0xa518c842UL, 0xae9a5702UL, 0x680b2a4dUL, 0x8c4ce366UL, 0xbe3c4f35UL,
+ 0xad4e2d8dUL, 0xf6d5af96UL, 0x94a6d54dUL, 0xfabdbbc0UL, 0x4ab5b599UL, 0x9c5540a0UL, 0xbef871dUL, 0x5020bcbfUL,
+ 0x27ccba4cUL, 0xc2ad99fdUL, 0xc492b7d5UL, 0x89420ee4UL, 0xf0479b8aUL, 0xb5b9e2a8UL, 0x91fd19c7UL, 0x8e401481UL,
+ 0xc3fbcc7aUL, 0x6735937UL, 0xf1a65f6dUL, 0x8ff82dcUL, 0x950a31faUL, 0xdaa08c51UL, 0xd154bda2UL, 0x6e724111UL,
+ 0xeca8807cUL, 0x548c96d5UL, 0xd45e19b6UL, 0x3ba3470aUL, 0x68233583UL, 0xc8e7b15cUL, 0xeca18747UL, 0x736b6c71UL,
+ 0x453fdbaaUL, 0x91c269fbUL, 0x865d3315UL, 0xeb3bb493UL, 0x49055d6fUL, 0x2dc3506aUL, 0xe070fc87UL, 0xc505c9e8UL,
+ 0x44a6e3a8UL, 0x450b4256UL, 0xf4a84f44UL, 0xf4fed6e0UL, 0x55d312a0UL, 0x99057259UL, 0x35e3aefaUL, 0x2bce3816UL,
+ 0x945d3fa0UL, 0xbae3050fUL, 0x6de8c6fbUL, 0xdda9e74aUL, 0xb10f4f7cUL, 0x7ac32f3bUL, 0x9a223b01UL, 0x8e718656UL,
+ 0x8363779eUL, 0xe924cca9UL, 0xb499421cUL, 0xb5d2f1a1UL, 0x2a2c8c2aUL, 0x7d0a75a0UL, 0xc6cb3123UL, 0xbeb7ed4cUL,
+ 0x22c8672bUL, 0x73348d95UL, 0x2c9a2d72UL, 0x6f201d28UL, 0x53c357ceUL, 0xce5ccc3eUL, 0x7770f5c3UL, 0xc9b656b6UL,
+ 0x87435794UL, 0xf08461beUL, 0x851d28c9UL, 0x5f1a4092UL, 0x8f03b2b7UL, 0xada298aUL, 0x5454f538UL, 0x22632a6eUL,
+ 0xca1341d9UL, 0x2d0e9cb9UL, 0xb14e1561UL, 0x1068131eUL, 0x7a0875f7UL, 0xab69672cUL, 0x2e71ec40UL, 0xdb1a4408UL,
+ 0xa6c2f690UL, 0x14396968UL, 0xc3902cf3UL, 0xb9f5f128UL, 0xb6ff7b04UL, 0x7c8b7cc6UL, 0x11ffb337UL, 0xd3a1d37dUL,
+ 0x1ff37a9UL, 0xa965477eUL, 0x1cbfeef1UL, 0xc5927444UL, 0xd5de63dUL, 0x30ce2407UL, 0xdf5a1030UL, 0xf5bd5046UL,
+ 0xb990d923UL, 0xc1dbe753UL, 0x85566adeUL, 0x77188157UL, 0x7849301UL, 0x773c2be5UL, 0x27927d70UL, 0x234b2b7dUL,
+ 0x87e22228UL, 0x7fe8e7c6UL, 0xef0b97ecUL, 0xfe831965UL, 0xfa6b836dUL, 0x7308a745UL, 0xa9c9da91UL, 0xcc2979d3UL,
+ 0x3006b588UL, 0x36cc8b35UL, 0xfb2d1f38UL, 0x178f9872UL, 0xc1a5c068UL, 0xae9f33a5UL, 0x4aa01a2aUL, 0x899c9022UL,
+ 0x1b26bc27UL, 0xacec7d92UL, 0xe6066809UL, 0xe288318dUL, 0x50800c0cUL, 0xcbd3fa4fUL, 0xa4ac356fUL, 0xca091ffbUL,
+ 0x74926b43UL, 0xb9097f6UL, 0xcd62e91fUL, 0x1fccd44eUL, 0xd7e51519UL, 0x87c14338UL, 0xb78be653UL, 0xfeba7acaUL,
+ 0x8616ad3UL, 0x9733f123UL, 0xd32e4bb8UL, 0x877ff5d6UL, 0xe2de87baUL, 0x75f4166UL, 0x22c73707UL, 0xea31abfaUL,
+ 0x816b73edUL, 0xfea5ba6fUL, 0xae733f3UL, 0xa16c13afUL, 0x57495c39UL, 0x727f6ba2UL, 0x24fb80d8UL, 0xeb4b05f4UL,
+ 0x533f400cUL, 0x3dd68fedUL, 0x8049706dUL, 0xc65e1079UL, 0xbb9dd117UL, 0xe4127472UL, 0x5d8271b6UL, 0x8b198d92UL,
+ 0xb06363e2UL, 0x809c7b5dUL, 0x37e536faUL, 0xe9ac961eUL, 0xd0ee7a97UL, 0xf2db6edbUL, 0x806fc957UL, 0xa8b076a2UL,
+ 0xf6ce9c26UL, 0xc17f16fUL, 0x6b09825fUL, 0x13f6bb76UL, 0x25d370adUL, 0x8fdb2639UL, 0xb955d8c1UL, 0x2d23b930UL,
+ 0x93fffe49UL, 0x9eac43a0UL, 0x5055ed05UL, 0x34e637e2UL, 0x4b7a40fbUL, 0xee9a9db6UL, 0x99474c73UL, 0x8e394b5aUL,
+ 0xf25ac823UL, 0x1bde98a3UL, 0x2b446c92UL, 0xa8ff251cUL, 0xacdf26ebUL, 0x96aef9acUL, 0xa78b7af5UL, 0x8c97634bUL,
+ 0x1a847be6UL, 0x2c2cf10fUL, 0xd0f25b9eUL, 0xcb363337UL, 0x99f3ca4aUL, 0xfbf7dd00UL, 0x3494818bUL, 0xc2ef54a8UL,
+ 0x39993c6UL, 0xc6862e60UL, 0x2d904b53UL, 0x4f35fc3aUL, 0x287097b1UL, 0x18c6af9fUL, 0xf73c6fc2UL, 0xe12fc820UL,
+ 0xf1698618UL, 0xe6961991UL, 0x552349d8UL, 0x3684d7baUL, 0x3a3b0531UL, 0xd2ab6eabUL, 0x9b484b49UL, 0x42638c92UL,
+ 0x9b9bd609UL, 0x4bbc1435UL, 0x874809b7UL, 0xa56d2f9UL, 0xfc148b2dUL, 0xc22a4232UL, 0xfceadd57UL, 0x72bb7b2fUL,
+ 0x56aa96adUL, 0xa17167f0UL, 0xa30f28d5UL, 0x84e3aa91UL, 0xef6347a7UL, 0xe9d10ad1UL, 0xf48c8162UL, 0xec6a6e07UL,
+ 0xb8fe93a0UL, 0x8cc420eeUL, 0x3b83e545UL, 0x1ec66cb6UL, 0xadddb0d7UL, 0xbcce7924UL, 0xd5ca9fd1UL, 0xf3ad3b1dUL,
+ 0x3505ee34UL, 0x4fba111cUL, 0xdb999eeaUL, 0xc140590fUL, 0x322aac49UL, 0x4533b329UL, 0x3b35083cUL, 0x51ca2ca4UL,
+ 0x87d3cd41UL, 0xa7eb81fbUL, 0xcacfde88UL, 0x6e3f753bUL, 0x12de103eUL, 0x6aaa507eUL, 0x499dac5cUL, 0xc2e18ba8UL,
+ 0x4781d611UL, 0xe7f470a3UL, 0xf56f0b7eUL, 0xd1e8268aUL, 0x529fe657UL, 0xb6cb9af6UL, 0x77c15de0UL, 0x29b91102UL,
+ 0x44030460UL, 0xd2ed14c4UL, 0x83493c33UL, 0xa373f042UL, 0xbf13d7ffUL, 0x4591c6a2UL, 0x90d9d462UL, 0x944dcf89UL,
+ 0x8f261718UL, 0xc69d60bbUL, 0x684c442eUL, 0xde3d9921UL, 0x27853374UL, 0x9541d1bcUL, 0x22ccf8d2UL, 0x377d8a63UL,
+ 0xe8d1eb4eUL, 0x59e8f38cUL, 0x832fc225UL, 0xd9ac73e2UL, 0xaec43e42UL, 0xf411f9b8UL, 0xa2d10860UL, 0x179374bbUL,
+ 0x8e109ea2UL, 0xb4a14414UL, 0xdc983cd1UL, 0x46c07fe6UL, 0x78a62c1aUL, 0xc41edd92UL, 0xf2d72d3bUL, 0x88230174UL,
+ 0x4125fcafUL, 0x3ace276cUL, 0x462da854UL, 0x1ed7ebc0UL, 0x98f9f98fUL, 0x34e3d84cUL, 0x1f03fda8UL, 0x91e7c847UL,
+ 0x2d96935dUL, 0x84a34252UL, 0x72d95b19UL, 0xa4d586ddUL, 0x26d9fa13UL, 0x6562f1ffUL, 0x8194120bUL, 0x6e22e7d8UL,
+ 0x62818193UL, 0x8f979892UL, 0x85305232UL, 0xae4bd596UL, 0x51f78c0fUL, 0xf32679d9UL, 0xf982d31cUL, 0x838165e2UL,
+ 0x610a50b7UL, 0x673dc19aUL, 0xb50bcfb6UL, 0x86a4b653UL, 0x86915223UL, 0xe20c234cUL, 0x174bb004UL, 0x61247e4cUL,
+ 0xa3189e6aUL, 0x5d9c81b1UL, 0x45673092UL, 0x2f3ec813UL, 0x4d2b70cUL, 0x56cab1e5UL, 0x5ec92b8fUL, 0x8d94856UL,
+ 0x82d9f4f2UL, 0xa55770c1UL, 0x8d8bc71aUL, 0xa4572421UL, 0x4029823fUL, 0x3000f02UL, 0x9cc4c131UL, 0x688b806dUL,
+ 0xa451b427UL, 0xd1fb98eUL, 0x4fc05c6bUL, 0xb59f87d3UL, 0xe9905edbUL, 0xd1cd5897UL, 0xfce43907UL, 0x484a127fUL,
+ 0x2bcf367dUL, 0xe4f4a92dUL, 0xbb5621baUL, 0x1a7baa3eUL, 0x2080ee84UL, 0x9f9aef05UL, 0xc08c09e7UL, 0xa5dfb60eUL,
+ 0xe1f3f037UL, 0xec09231cUL, 0x693d8610UL, 0x11750507UL, 0x7768a574UL, 0x2280b572UL, 0xcebd9c9aUL, 0x83229d39UL,
+ 0x76bbfd06UL, 0xd0b15778UL, 0xd32f5406UL, 0x59205104UL, 0xe4387577UL, 0xa7035a26UL, 0x833a9e8dUL, 0x5271a98eUL,
+ 0x20b12517UL, 0x690c7b51UL, 0x919772c5UL, 0x5a91f115UL, 0xa42ff04dUL, 0x12c638a8UL, 0x14db1586UL, 0xf93a9120UL,
+ 0xc3360fc7UL, 0xae6bc968UL, 0xf404688fUL, 0x406d69e7UL, 0x2e3cd0cbUL, 0x1f1fde79UL, 0x9bfa81baUL, 0x74be4e30UL,
+ 0x2b011447UL, 0x2f5a5654UL, 0xe1a739dfUL, 0x18ec4965UL, 0x4c44ae89UL, 0x188c8f60UL, 0x89d62199UL, 0xc322f6aeUL,
+ 0xcf02fb20UL, 0x7f34ed1bUL, 0x5a81d96aUL, 0xdc2d18a3UL, 0x145f3203UL, 0x30603144UL, 0xbb47c92UL, 0x489f3e60UL,
+ 0xd14d421eUL, 0xd71c6803UL, 0xda89c067UL, 0x37cbf2bdUL, 0xe6397a79UL, 0xf2a6dfa7UL, 0x1c88b98UL, 0x86249df5UL,
+ 0x2160b7dfUL, 0xfa36599fUL, 0xfe1fba78UL, 0x8073d6f7UL, 0x44f1bebeUL, 0x90d6c3abUL, 0xf5e9afcbUL, 0xe9bfb878UL,
+ 0x35eea7afUL, 0xd73a8c96UL, 0xe194bcf5UL, 0x9116211cUL, 0x3b4ad4d9UL, 0x3d34a826UL, 0x21d9c311UL, 0x5d438cf9UL,
+ 0xc96ea9a6UL, 0x644646ffUL, 0x6d2b3e00UL, 0xfd4801e7UL, 0x18d5811dUL, 0x1b12e36eUL, 0x734e6d25UL, 0xec4f9478UL,
+ 0x359a592cUL, 0x3e2d2668UL, 0x588f7647UL, 0xb7800f74UL, 0x3d213540UL, 0xe73635feUL, 0xa75e04e4UL, 0x881a8fc1UL,
+ 0x8b9cff09UL, 0xf80edfe1UL, 0x62b3899eUL, 0x9c1a5db3UL, 0x6edac689UL, 0xc714af77UL, 0x4d158e42UL, 0x7e7ecd98UL,
+ 0xa84372c8UL, 0xd982f8feUL, 0xd2fef8eeUL, 0xc3d8485dUL, 0x544dd5b0UL, 0xaa7a06ebUL, 0xcb848c85UL, 0x8e4efc92UL,
+ 0xe16b2dcdUL, 0xaadc73b3UL, 0x8d5380f5UL, 0xf0d4a16UL, 0x434197a2UL, 0x697a3503UL, 0x23556634UL, 0xfc03fd53UL,
+ 0x9718f6dbUL, 0xd1afd968UL, 0x12ab3f56UL, 0x389c4131UL, 0x68f1ebfeUL, 0x24fcb82cUL, 0x7d9e8006UL, 0x31ab6383UL,
+ 0xd2a0ce9UL, 0xb1ec3c37UL, 0x2ac7f99bUL, 0x2c4f68caUL, 0x5d97f8e1UL, 0x961f55c1UL, 0x424199c6UL, 0x9e770f31UL,
+ 0xc8fc02b5UL, 0xea7e616UL, 0xb51a74a2UL, 0xc182fb58UL, 0xad62f64aUL, 0x469503a5UL, 0x264a2699UL, 0x6b396065UL,
+ 0x5ec6efe0UL, 0xe7bf1262UL, 0xba79e93cUL, 0xaac820a6UL, 0x2a060e9dUL, 0x5052d90UL, 0x1a498617UL, 0x2b1c7df0UL,
+ 0x7fd871bfUL, 0xd9ae8241UL, 0xd3421483UL, 0x6558a25cUL, 0xa0915a39UL, 0x9f8fbf20UL, 0x8adee879UL, 0x641ad89fUL,
+ 0x90c5f92eUL, 0xfa122e4dUL, 0xf3552911UL, 0x4104e16bUL, 0x9d67421bUL, 0xce628fa0UL, 0x79652188UL, 0x81ccf397UL,
+ 0x631cc54bUL, 0xd0fe57e9UL, 0xaa5e93a7UL, 0xd65d4520UL, 0x3ecc908eUL, 0x9dd1c68bUL, 0xcd1ea333UL, 0x3c4f1df8UL,
+ 0x7237828eUL, 0xcb79291cUL, 0xb6f70fa6UL, 0xdb54c3a0UL, 0x10235a28UL, 0x35cc101eUL, 0x84e41906UL, 0xcf77c13cUL,
+ 0x6247bc49UL, 0xf2b04388UL, 0x65d69f35UL, 0x72830c3dUL, 0xfbb2da08UL, 0xc128f266UL, 0x394e90a7UL, 0x316ce785UL,
+ 0x3e69249aUL, 0x8729b0b1UL, 0x60aa2364UL, 0x5fcebae3UL, 0x4201e367UL, 0x7ee3bdb0UL, 0xfe4b5609UL, 0xd6cdf865UL,
+ 0x118ad798UL, 0x48da443aUL, 0xa907b8cbUL, 0x8a89848cUL, 0xfd6222adUL, 0xc256a23aUL, 0xbd1ec4e7UL, 0xd4fd513bUL,
+ 0x6cd2fb71UL, 0xbc2f618fUL, 0xb21d7cf9UL, 0xb5737961UL, 0xaae1f52UL, 0xfedb3824UL, 0x2cc5c01bUL, 0x664168d1UL,
+ 0x6eb3e1b1UL, 0xcf559a6fUL, 0xcfc8ef69UL, 0xe051ca99UL, 0x61bcf33aUL, 0x98274788UL, 0x41adf3b2UL, 0x352bd9abUL,
+ 0x78d0a8e2UL, 0xa25b7fa3UL, 0xddff1a65UL, 0x2db8fe2eUL, 0x488dd326UL, 0xf79a3868UL, 0x5610e753UL, 0xa5f67de0UL,
+ 0x34e5eeccUL, 0x77a1d91dUL, 0xb52bc7cfUL, 0x5c90c2fbUL, 0x41ed2f0UL, 0x675dadecUL, 0xf3b3a3aeUL, 0x8af860b9UL,
+ 0x57dbd4c0UL, 0x93c8e633UL, 0xd45d892fUL, 0x86d80bf0UL, 0xe98cdc94UL, 0x118fda9UL, 0x38bc69eaUL, 0x21819a82UL,
+ 0x1df9f5d1UL, 0xb99ab450UL, 0xe59ed22fUL, 0xa4eef5UL, 0x223b68f2UL, 0xdc76c6cfUL, 0xc4c7da1UL, 0x702de06fUL,
+ 0x9aec94fcUL, 0xed9d1a6fUL, 0x5f04f369UL, 0xe6845131UL, 0x8cc49da0UL, 0xe4491ebbUL, 0xffcd0152UL, 0x2dc301faUL,
+ 0x4dcb254dUL, 0x38f1ddaaUL, 0x7c619c07UL, 0x906c2639UL, 0xd8a03622UL, 0x5a75c15aUL, 0x7e3cf2aUL, 0xf13a7b92UL,
+ 0x4827d602UL, 0xc1c15156UL, 0x999f1d90UL, 0xa6dbea89UL, 0x9f5353c6UL, 0xa2ee8ed8UL, 0x1d51c60aUL, 0x6c4cdc83UL,
+ 0x2ab49dc4UL, 0x359d5972UL, 0x7ab23993UL, 0x6baa4569UL, 0x34f3286fUL, 0x6244aa32UL, 0xa37836cUL, 0x22d8a4d5UL,
+ 0xc65dfb99UL, 0xaaefb00fUL, 0xc69c48d5UL, 0xced887a2UL, 0x4acf161cUL, 0xdb5b5650UL, 0x1597d364UL, 0x4e22047UL,
+ 0xfe8b11a5UL, 0x8b7c8c42UL, 0xeec427b5UL, 0xa7ef4c9UL, 0x8ec1b6dbUL, 0x7fbceac3UL, 0x1c445e1cUL, 0x8ce13c9aUL,
+ 0xf9b1ee8eUL, 0xa0788969UL, 0xa8c5742dUL, 0xb4408b5cUL, 0xede8a427UL, 0xbe7f56d0UL, 0x4d688028UL, 0xcdbc7243UL,
+ 0xc894b9c5UL, 0x76a85fc1UL, 0xec31a564UL, 0x42773cb2UL, 0x50118243UL, 0x1e3c295cUL, 0x81a15eddUL, 0xc2244554UL,
+ 0xce7e55b4UL, 0x79da69d5UL, 0xcf73a620UL, 0x9055baf7UL, 0xc5afe6feUL, 0xb3f9e84aUL, 0xa6198a20UL, 0xb4bd071bUL,
+ 0x17737db0UL, 0x30ff44fdUL, 0x987843ffUL, 0x1d9a164fUL, 0x3d2be754UL, 0x3304b0e6UL, 0x9d82a80cUL, 0xce8a03b6UL,
+ 0x7770815UL, 0x15e89cd5UL, 0x8a0c9e04UL, 0x9869ce6cUL, 0x5aa7b72fUL, 0x12706a44UL, 0xc106d9dUL, 0x6ed89edUL,
+ 0x4ae9cc5bUL, 0x7e739fddUL, 0x68227041UL, 0x7ae4455bUL, 0xb7d7ccccUL, 0xf1fe0c25UL, 0x9e39cedbUL, 0x85a6cee9UL,
+ 0x8b61070bUL, 0x7bcb0f79UL, 0x63cbfe8cUL, 0x68958039UL, 0xb6c8e748UL, 0x5b81cc9bUL, 0x59e8b7eeUL, 0x19b68e5bUL,
+ 0x9dfa592fUL, 0xfbc837dfUL, 0x28221b0fUL, 0xefa21aefUL, 0xbff424c8UL, 0xa1452c62UL, 0xf698f4f3UL, 0xd74357a4UL,
+ 0x4846ca53UL, 0xb794affUL, 0xbf405fefUL, 0x85b371dcUL, 0x59ae29cUL, 0x7192f4a9UL, 0xa2dd7660UL, 0x901d8feaUL,
+ 0x1ab44efcUL, 0xceed62c1UL, 0xa8349573UL, 0x53b63579UL, 0x1dabf94fUL, 0x8ce395a7UL, 0x5727b83bUL, 0xeca0c872UL,
+ 0x36dafe0aUL, 0x97ae2f6eUL, 0xca1cca8bUL, 0xa5d47cabUL, 0x9687a068UL, 0x31b8a059UL, 0x2371ec06UL, 0xf7f49eedUL,
+ 0xe1ff5ccbUL, 0x7e64a26fUL, 0xe7cf270UL, 0xc0da6a4aUL, 0x28ef946fUL, 0xeaa52afbUL, 0xd9b940ddUL, 0xfcf34163UL,
+ 0xd37aa81dUL, 0x72957680UL, 0x40806710UL, 0xc25825b4UL, 0x9dc77589UL, 0x7367d48aUL, 0x65f3e8aaUL, 0x1119332bUL,
+ 0x32d986b9UL, 0x906795a7UL, 0x2adc9be2UL, 0x9761ddf4UL, 0xd4eba240UL, 0xfadf068cUL, 0xb91389c7UL, 0xaafcbcf3UL,
+ 0xff4c4fa6UL, 0xd97decd2UL, 0xe97a7428UL, 0xd2c3896cUL, 0x915808d6UL, 0x91a00cb6UL, 0xf0baec7bUL, 0x2e005b9fUL,
+ 0xf54c2385UL, 0x4ac855ebUL, 0xd4773235UL, 0xb14d35e8UL, 0xdd24d1ceUL, 0x86faf7f0UL, 0x54a4be1dUL, 0x694282fUL,
+ 0xa1ddfcb2UL, 0xd551884eUL, 0x2e91b3dbUL, 0xc68ec76UL, 0x27189904UL, 0x3100abddUL, 0x8c095b2UL, 0x2f0d6e03UL,
+ 0x9e3acfdeUL, 0xfd51ba5dUL, 0xbb071598UL, 0x1003f059UL, 0x6f9eef9UL, 0x9898712fUL, 0xfc68b7ecUL, 0x2ae0daecUL,
+ 0xe4edc5fUL, 0x6abeb3d0UL, 0x21960cefUL, 0xc03c3aeUL, 0x15fdc33fUL, 0x18456be7UL, 0x16d27ef3UL, 0xe9cfa155UL,
+ 0x9b04c324UL, 0x13b6fae9UL, 0x73413f8bUL, 0xe72347d0UL, 0xbdc4874cUL, 0xe96ee23dUL, 0xd485b848UL, 0x394f835fUL,
+ 0xd04bc256UL, 0x8f64edefUL, 0xeb786c2fUL, 0x441af841UL, 0xc5bbbe74UL, 0x949ea0a1UL, 0x198cecdbUL, 0xddd6c13dUL,
+ 0xef9f0881UL, 0xf8871a89UL, 0x89c8a613UL, 0xc79c9fbdUL, 0x98e8b33aUL, 0xee67b89aUL, 0x89482d41UL, 0x7f674cefUL,
+ 0x9f99b03eUL, 0xd6c8d1d3UL, 0xe73748ddUL, 0xa347e4e5UL, 0xdf454d65UL, 0xdd189176UL, 0xc318cb07UL, 0x156b23a6UL,
+ 0xbe245473UL, 0x6ab8df60UL, 0x44460665UL, 0x489e295eUL, 0xab4ebb4aUL, 0x2400fa3UL, 0xd477830UL, 0x472f0f31UL,
+ 0x32fedbb0UL, 0x15a50034UL, 0x9d2466d8UL, 0xf18b7f4eUL, 0xe8226217UL, 0xc5aeb632UL, 0xb684167aUL, 0xf9567166UL,
+ 0xd6e5b9cfUL, 0x42e9d48fUL, 0xf9fd44f9UL, 0x275e19a5UL, 0xfe288a40UL, 0x511698bbUL, 0xca708099UL, 0xaac2bc87UL,
+ 0x299c7ebcUL, 0x60abf55aUL, 0xdf983b19UL, 0x4a3abd73UL, 0x233b5904UL, 0x17bfb237UL, 0x10591ca6UL, 0xacdc596eUL,
+ 0x31f2f6aaUL, 0x63d784b0UL, 0xd82d3cb7UL, 0xa8d2b1b4UL, 0x4ef8d2bdUL, 0xea026ec1UL, 0x93424c7dUL, 0x69e20cdfUL,
+ 0x2766ef16UL, 0xd86663e2UL, 0x406bc165UL, 0x4d54a682UL, 0x6f6a64f7UL, 0xa2402b05UL, 0xc6c546caUL, 0xc86efd6eUL,
+ 0x4884b00UL, 0x5160119bUL, 0x68d849acUL, 0x86b4db23UL, 0xc72b3e07UL, 0x9d1eadaUL, 0x99d981b9UL, 0x201ac691UL,
+ 0xdc66b0d2UL, 0x278bba66UL, 0x290ce353UL, 0xae26c58aUL, 0x4e0216bfUL, 0xf1a77800UL, 0xf0a57df7UL, 0x7ce5a173UL,
+ 0x63e984c9UL, 0x73f97f20UL, 0xb0fcffdbUL, 0x89582c62UL, 0x7a3d6c8UL, 0x3eb93528UL, 0x359c3e7bUL, 0x3617f09cUL,
+ 0x8f28346aUL, 0x37afbd61UL, 0xa63e9c66UL, 0xf2149f20UL, 0xb2c91957UL, 0x638c332dUL, 0xbe64ad6bUL, 0x10c376eUL,
+ 0x68b38c7aUL, 0x926f584fUL, 0x3f07d3d8UL, 0x868b64f4UL, 0xf3f5f5a4UL, 0xe09b46fbUL, 0xfa837dfeUL, 0xd806ef96UL,
+ 0xf4f468e2UL, 0x539d574UL, 0xd901b287UL, 0xc78ef8d4UL, 0x56ea5ec5UL, 0x46d8e586UL, 0xa2bf27c1UL, 0x8e0505a5UL,
+ 0x9c1e0a5fUL, 0xf586ea97UL, 0xae81ee4aUL, 0xb0fdb723UL, 0x330a661fUL, 0xdf83e6d5UL, 0x204afabbUL, 0x10cfb926UL,
+ 0x91129e3fUL, 0xc4a7d0b4UL, 0x33bd34daUL, 0xb2d148d7UL, 0x96482adeUL, 0xc60a3e7fUL, 0xc6e539f7UL, 0xf9f42958UL,
+ 0x551d5b9aUL, 0xbc43ce10UL, 0xf639478cUL, 0xad8f10c3UL, 0xacb000c8UL, 0x16e88071UL, 0x8d4b3803UL, 0xd2574f31UL,
+ 0x2d533e33UL, 0xbf255c6eUL, 0x477a3023UL, 0xc95a6f2aUL, 0xb6a4621eUL, 0x21c92546UL, 0x4b9ddfbUL, 0x1d46c16aUL,
+ 0x216f22b4UL, 0x8351d787UL, 0x6ead1f45UL, 0x5cf319faUL, 0xad2b0964UL, 0x664d87adUL, 0xbd063222UL, 0xff9d3cfaUL,
+ 0x5913d42bUL, 0x32ec1b24UL, 0x8f22efa9UL, 0x588ada7eUL, 0x62639adeUL, 0x678f4a6dUL, 0x21a4b201UL, 0x59e8bb94UL,
+ 0x7da4a61aUL, 0xdf39bb44UL, 0x2053e5bUL, 0x72f8b70UL, 0xc61881bUL, 0x8a1d5707UL, 0xbb5cbe52UL, 0xfdaaece0UL,
+ 0x83a08870UL, 0x1f7a43ecUL, 0x91921115UL, 0x4be8e670UL, 0xf7defc1UL, 0x5501498eUL, 0x5fc93f69UL, 0x41a0bc13UL,
+ 0x8fd6b672UL, 0xac0424c0UL, 0xea3abbc7UL, 0x455bb4aUL, 0x7f6be9f0UL, 0x9f74e9eeUL, 0xd70fe0f9UL, 0xb93bb6abUL,
+ 0x4315b10aUL, 0x9bcaecd0UL, 0x771f4745UL, 0x256b5836UL, 0x2ca39dc9UL, 0x9442775eUL, 0x65bde132UL, 0x65f1cd0dUL,
+ 0xa4471f2fUL, 0x1428d979UL, 0x9d55b7d4UL, 0xf2a5ead8UL, 0x6a952f0dUL, 0xf453f8cfUL, 0xcedb9d69UL, 0x1153e3d9UL,
+ 0x11e2fa07UL, 0x2c191fd2UL, 0x3f9bf46aUL, 0x3a9622d4UL, 0x9ca19bf6UL, 0x4b8e897eUL, 0xa8d84441UL, 0x4310ad9dUL,
+ 0x8309c973UL, 0x25870803UL, 0xc073a035UL, 0xbd3d3e4bUL, 0x14b3fedaUL, 0xc6140944UL, 0xa705e251UL, 0x6d2d1b4bUL,
+ 0xd9a25006UL, 0x1fe112b7UL, 0x92cec768UL, 0xee018f5UL, 0x380f6894UL, 0x9e039161UL, 0x3fb9c871UL, 0x5e43caa4UL,
+ 0x1b8a7dcUL, 0x954ce50bUL, 0xf255d704UL, 0x6eed5748UL, 0xbbc21d15UL, 0x9ec2095aUL, 0xe461675cUL, 0x4d979cc4UL,
+ 0x75e5f74aUL, 0xc093b810UL, 0xf51b8156UL, 0x6ab8a57eUL, 0x607869UL, 0xda08a9dfUL, 0xe313934aUL, 0xa795ed5dUL,
+ 0x475f57b9UL, 0x439f3304UL, 0x649e21c5UL, 0xea49a581UL, 0xdf6c4ee3UL, 0xd618bb2fUL, 0x2043771eUL, 0xbf80e391UL,
+ 0xe36302d3UL, 0xc53e34d6UL, 0x27af9cb2UL, 0xc94af8c7UL, 0x1c09994dUL, 0x49787e9aUL, 0x410cb26fUL, 0xafde91d5UL,
+ 0x5d6b06aeUL, 0xac614cbfUL, 0x388bc318UL, 0x3e464b36UL, 0x5a067edeUL, 0x9080f267UL, 0xbe178ea9UL, 0xaf4e04a9UL,
+ 0x47b0e418UL, 0x2f377aa1UL, 0x1a174484UL, 0xed206452UL, 0x4ff62adcUL, 0x72936f2dUL, 0x3d017c5cUL, 0x43f33980UL,
+ 0x23163a2aUL, 0x33cff183UL, 0x418f6e33UL, 0x3bb05ac8UL, 0x476519bbUL, 0x51035d9eUL, 0xcda31e8cUL, 0xd15d722eUL,
+ 0xc7eb8cdfUL, 0x4fae1bdUL, 0x6a79780UL, 0xa1440d48UL, 0x52d594cdUL, 0xdfa599aUL, 0x8c3cbaa0UL, 0x77188155UL,
+ 0x8a1e12baUL, 0x140bc6c5UL, 0xc2830d6aUL, 0x859a64e6UL, 0x9491682cUL, 0xef3467e9UL, 0x3c2ab895UL, 0xcd6a8a02UL,
+ 0xa23e20a9UL, 0xfd47341fUL, 0x44a5891aUL, 0x2ba1b0b4UL, 0xcdd8c6fcUL, 0xf9e68142UL, 0x75c0d746UL, 0x2ce90574UL,
+ 0x2640aa47UL, 0x890a1ed5UL, 0xcfe65dc5UL, 0xb78b03a5UL, 0xf8210382UL, 0xe067ea1fUL, 0xcd2a1f50UL, 0x838f003fUL,
+ 0xa877cac8UL, 0x6a8bb7ceUL, 0x4e6637UL, 0xd64e59c7UL, 0x1ffedfe0UL, 0x2eab0ecUL, 0x13e53385UL, 0x93dfb4b8UL,
+ 0xb9eb2993UL, 0xe99aeddbUL, 0x27e8a566UL, 0x9818f9fcUL, 0x4a1d18baUL, 0x13f0e864UL, 0xe5226cefUL, 0x6e2941a6UL,
+ 0xed10b15fUL, 0x3948892dUL, 0xa4becf5UL, 0xe54fe9e0UL, 0x5a95d382UL, 0x9a118541UL, 0x29fc22c8UL, 0x2c7a308cUL,
+ 0xceb56fabUL, 0xfb98d821UL, 0xabc5831cUL, 0xefea73b2UL, 0x4a5b8be5UL, 0x753df3e5UL, 0x9145b046UL, 0xe93eaf96UL,
+ 0x5efaf3e1UL, 0x2d317061UL, 0x894f5157UL, 0xe7d74345UL, 0xd675990UL, 0x19cf2f9dUL, 0xa20f5b88UL, 0xf74e14aeUL,
+ 0xadbc3777UL, 0xb357e1a9UL, 0xd4873456UL, 0x253a890dUL, 0x6771e0eeUL, 0x296fa2b0UL, 0x49c10fe3UL, 0xcbcaa004UL,
+ 0x95390996UL, 0xc71ac078UL, 0xc2075515UL, 0x30a52318UL, 0x11bd3c3bUL, 0xb0ca3283UL, 0x8ac6bda7UL, 0x261d42a4UL,
+ 0x6e2fb517UL, 0xdbace7c0UL, 0x9f39c4b1UL, 0xf70364d0UL, 0x5a994984UL, 0xb18d0b82UL, 0x47be62b3UL, 0x6a7d92eUL,
+ 0x2707e8a6UL, 0x83f5d2b0UL, 0x78915c40UL, 0x5a92aedbUL, 0xdd41937eUL, 0xe5594532UL, 0xf744db4aUL, 0x376c9856UL,
+ 0xf2c7291fUL, 0xdb176d7aUL, 0xc08e2eb7UL, 0xfad3f6c1UL, 0xbdd6d803UL, 0xc9930e07UL, 0xeab6c289UL, 0xdec4e61bUL,
+ 0xdd92800eUL, 0xb17d481cUL, 0x9359127cUL, 0x52fd5cb2UL, 0x12d95875UL, 0x384f48f1UL, 0xfa538621UL, 0x5cd8fdafUL,
+ 0x7349c3a4UL, 0x4cd0fbbdUL, 0xefbf478dUL, 0x2fdb9aedUL, 0x90526f98UL, 0xa4fb65dfUL, 0x62c08065UL, 0x1adbb20bUL,
+ 0xeea66a51UL, 0xa611b08UL, 0xddd57a16UL, 0x54020ee8UL, 0x1cf2bb22UL, 0xa063d4a7UL, 0xcf0d374UL, 0x6e0f4fccUL,
+ 0x5dd48904UL, 0x87f6a54aUL, 0xde7396ffUL, 0xe9c35a42UL, 0x1acfa877UL, 0xb23daabfUL, 0x5d8eb953UL, 0xdb3b55d9UL,
+ 0x7b70bbe2UL, 0xf183a5adUL, 0xf7fedd2cUL, 0x6ba0e50eUL, 0x62caea49UL, 0xe454f6fUL, 0x9f6eb045UL, 0x4654d3f0UL,
+ 0x74e5f85dUL, 0xc87b30f3UL, 0x46a23f27UL, 0x74b8ffadUL, 0x7a587406UL, 0x1b2ea028UL, 0x641a9688UL, 0x3f1f6201UL,
+ 0x9d13bbfeUL, 0x402ec644UL, 0xbc656419UL, 0x78ebeed1UL, 0xd3100c0cUL, 0x12868ef0UL, 0x951109ddUL, 0x487183c6UL,
+ 0x7abac81UL, 0x34ae6731UL, 0xd9bfaf6fUL, 0x7125ea87UL, 0xb9885f83UL, 0xca5639e1UL, 0x7146f5fUL, 0xc36579cbUL,
+ 0x9ce0b663UL, 0x185887ccUL, 0xcd91540UL, 0x45bfaecbUL, 0x953e390dUL, 0x4001f9a2UL, 0xb94658bcUL, 0xe99017b5UL,
+ 0xefae03eeUL, 0xb14fb571UL, 0x985752ddUL, 0xff2cf81dUL, 0x9f4318efUL, 0x1cd94b4aUL, 0x6bd3322UL, 0x711d158bUL,
+ 0x12c7e27aUL, 0xc74b5ae2UL, 0x4e5791f9UL, 0xad53aa3bUL, 0xb7f00dd2UL, 0xe59ae047UL, 0x9bbf337cUL, 0x78d78c7dUL,
+ 0x9c8e1825UL, 0xcc40a019UL, 0x46458764UL, 0x7ca40418UL, 0x5c3be4eUL, 0x6542f490UL, 0xbd36c3f9UL, 0x7048237fUL,
+ 0x392af68UL, 0x50f2911fUL, 0x9892c8a2UL, 0x9a52e8f9UL, 0x6d09e1b6UL, 0x598d299aUL, 0xaf5c87e2UL, 0xbb203135UL,
+ 0xe8064669UL, 0x205b9975UL, 0x2d16f83fUL, 0x869b21edUL, 0x18b2bf34UL, 0x3cd9ecc3UL, 0x925bf314UL, 0xcea45956UL,
+ 0xdccab8e6UL, 0x7a11cfaeUL, 0xb2970e8cUL, 0x72572c06UL, 0xc742bbaeUL, 0xe12bdadUL, 0xeae1f47fUL, 0x9462c708UL,
+ 0x799ee589UL, 0xf38849e3UL, 0xc612caacUL, 0xeae43cadUL, 0xf8d64ed3UL, 0xcecd2e95UL, 0xd8e82173UL, 0xaef83394UL,
+ 0xef5c2ea6UL, 0x84fac72cUL, 0x5b9ec1ccUL, 0x47765097UL, 0x3a7f4566UL, 0xd4c6c423UL, 0xa485b874UL, 0xaa897370UL,
+ 0xb09be9a0UL, 0xee20921fUL, 0xd9ff1a47UL, 0x8c207f4UL, 0xda7068cUL, 0x56640dd9UL, 0x4078663dUL, 0xc6e2681fUL,
+ 0x6b345550UL, 0x365a2d1cUL, 0xda4efd75UL, 0xa81cd61dUL, 0xca4def0UL, 0x6f9ce958UL, 0xbc7277f8UL, 0x6d9f8a53UL,
+ 0x96601006UL, 0xc70baf22UL, 0xb45d1e58UL, 0xe264fb43UL, 0xf42d29b8UL, 0xc2eb98eUL, 0x4d819cadUL, 0xc2d38f18UL,
+ 0x4a0512beUL, 0x5a16bebdUL, 0xbb8745e6UL, 0xe139ce0bUL, 0x7790e95cUL, 0xca547d3eUL, 0x3593c629UL, 0x13fbb269UL,
+ 0xf1319212UL, 0x5267dae7UL, 0xd56832d8UL, 0xdaadff07UL, 0x544e1e2dUL, 0x5fe6374cUL, 0xb60fade1UL, 0x73a0ca1cUL,
+ 0x965b92c8UL, 0x4163b3b1UL, 0x49c36901UL, 0xcbba1a0dUL, 0x6e9ba425UL, 0x4913e021UL, 0xadfa5e32UL, 0x71b1eb2UL,
+ 0x5299bcb0UL, 0xac5afb1fUL, 0xf6b258f4UL, 0xfb0614bbUL, 0xdaa32efbUL, 0x9c01adf4UL, 0x557f57f7UL, 0x1da7164fUL,
+ 0xe4a2727UL, 0xddf037c2UL, 0x22614f52UL, 0x5470f67eUL, 0xd87b2364UL, 0x1a8b324fUL, 0xcc4996c0UL, 0xa87a810fUL,
+ 0x972cfef5UL, 0xde8f255fUL, 0x37d1cfe7UL, 0x76ac33ebUL, 0x5920a626UL, 0x2c06fe5bUL, 0xb572734eUL, 0xca9be990UL,
+ 0xe87e9ebbUL, 0xac2f0121UL, 0xa2a41faUL, 0x5f8d1fa4UL, 0x6585d2e5UL, 0x851e3ad0UL, 0x4d26f430UL, 0x21aadeeaUL,
+ 0x5b5bf122UL, 0xe052330fUL, 0x88d60ce3UL, 0x13c88642UL, 0x9589d255UL, 0x908c8b85UL, 0x23e46f4aUL, 0x3b166983UL,
+ 0x1dbc7351UL, 0x8b365e99UL, 0xa29158fUL, 0xabf54021UL, 0x9cbaa2c0UL, 0xc02d9e56UL, 0x915d04e2UL, 0x6220b87eUL,
+ 0x255fa5f9UL, 0xa1740d6bUL, 0x8bd82d6eUL, 0xeb1e7d55UL, 0x5b41c3b6UL, 0xa60db5a8UL, 0x271404c7UL, 0x832153aeUL,
+ 0xeff1fb3eUL, 0xebeb9a92UL, 0xafb53565UL, 0x2834dceeUL, 0x16155e23UL, 0x16a090fdUL, 0x51a1c6c3UL, 0x446ab84dUL,
+ 0x55ba824bUL, 0x2c18287bUL, 0xb541349cUL, 0x9a8f01ddUL, 0xb8ea7615UL, 0x3c57f0e5UL, 0x210d39e4UL, 0x7bc77a95UL,
+ 0xe799092eUL, 0xb3644701UL, 0x607bf2b7UL, 0x3a989e9dUL, 0x67fab219UL, 0x8fac5b8aUL, 0xbfa7af75UL, 0x48bc18b0UL,
+ 0x438edae7UL, 0x5efc98b1UL, 0x1584911aUL, 0x2715c213UL, 0x27f9e42cUL, 0x827d75e9UL, 0x51d4181dUL, 0xa523d515UL,
+ 0x7c11840dUL, 0x966d3e19UL, 0x5ea53629UL, 0xbb153662UL, 0xdf888316UL, 0x56bcf141UL, 0x80aaf9dbUL, 0x2d072903UL,
+ 0xed76b306UL, 0x21876f5eUL, 0x78f929e7UL, 0xea0713cbUL, 0xfb69a207UL, 0xdd40bb58UL, 0xdf9152bfUL, 0x1e9c975UL,
+ 0x40db3e80UL, 0x9cd86823UL, 0xdf466feaUL, 0xef03662bUL, 0xd3c73f0dUL, 0xcc7a9271UL, 0xe899db27UL, 0x79af7c4fUL,
+ 0xde3940abUL, 0x9aea0d47UL, 0xef36d448UL, 0x19550274UL, 0x923169ceUL, 0x9886257eUL, 0xfcd14b7bUL, 0x6f5eb64eUL,
+ 0xe89ff5faUL, 0x69d472d5UL, 0x882a3d59UL, 0x5cdd4d2eUL, 0x88da155eUL, 0xbb260026UL, 0x5edccfa6UL, 0xc94a0fd3UL,
+ 0x8994320dUL, 0x35d937aUL, 0x1dbebce5UL, 0xf3d5259fUL, 0xb05d73a1UL, 0x6fb55a40UL, 0x5c6c3bcdUL, 0x22852c6eUL,
+ 0xe2ba24cbUL, 0x680d338aUL, 0x1377ab3bUL, 0xf51fe122UL, 0xd6a52fe1UL, 0x153e9fd2UL, 0xb8c6b55dUL, 0xf534c99bUL,
+ 0xcba7525eUL, 0x1051686cUL, 0xa6a131ddUL, 0xb05d7cf1UL, 0x1a2ab9b3UL, 0xf71f3884UL, 0xd41c3391UL, 0x54afe5e5UL,
+ 0xce9e25cUL, 0x7b084d6UL, 0x14b122dfUL, 0x25f71393UL, 0x5c50f98cUL, 0xc532b9f6UL, 0xeeade3adUL, 0x7dd29a24UL,
+ 0x793b4422UL, 0x105505ceUL, 0x6f100d6dUL, 0x3570c72cUL, 0x6e7a700bUL, 0xedab0cb6UL, 0x92bd2e92UL, 0xa3adfa86UL,
+ 0xa02bced6UL, 0x7d0ace7fUL, 0xb507a21UL, 0xc22dd228UL, 0x356e0d9bUL, 0xaaf982a9UL, 0x3651b024UL, 0xceb698d0UL,
+ 0x490e3760UL, 0x1f606295UL, 0x2b1bd5a8UL, 0x870b340dUL, 0x5835b5ceUL, 0x4b9aa6dbUL, 0xcb5a9af7UL, 0xa99f9cf9UL,
+ 0xde359bbUL, 0x11b42605UL, 0x96cb18a1UL, 0x949a7b70UL, 0x7f867ec6UL, 0x29e3624eUL, 0x1e2f9742UL, 0x82520d93UL,
+ 0x47672783UL, 0xedb6bd0bUL, 0xb7f6daa0UL, 0xcd6686b3UL, 0x55ce4a12UL, 0xbda310dfUL, 0xab6d2c40UL, 0x72b44b56UL,
+ 0x1733fa1UL, 0x97a7e87fUL, 0xafa23869UL, 0x8bd977cUL, 0xc803978dUL, 0x952b1c4bUL, 0x99f65af7UL, 0xf7b2b59bUL,
+ 0x22d91a3eUL, 0xafde9be4UL, 0x9ff526cfUL, 0x22f1d450UL, 0x7c1892dfUL, 0x8c770cd8UL, 0x35c166deUL, 0x25f803dUL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL, 0x0UL,
+ 0x65fc8eb6UL, 0x11afd58eUL, 0xf8cbae38UL, 0xf44ec1c2UL, 0x1a21a82eUL, 0x669c168UL, 0xbc165dbeUL, 0x5225e682UL,
+ 0x165b7dddUL, 0x5fa769f7UL, 0xa62a1f66UL, 0xa5d71b9eUL, 0xe5227cfdUL, 0xa06bc899UL, 0xfaea47e3UL, 0x96c3ce19UL,
+ 0x25517ab2UL, 0x6c7c5acfUL, 0x7a5996a2UL, 0x1300f529UL, 0x3b5d1c75UL, 0x3f07c46cUL, 0x64fb4693UL, 0xa0e18448UL,
+ 0x8f8d32c4UL, 0x3b9ed5fbUL, 0x8bcbd9bfUL, 0x702f27b0UL, 0xb4fb0b9aUL, 0x656c9949UL, 0xe6d61f45UL, 0x162e7a80UL,
+ 0xafaeb34fUL, 0x22cac5eUL, 0xc2a70f8cUL, 0x64cc1aeeUL, 0xce0753acUL, 0xe1ad0ccdUL, 0x127dc737UL, 0xda216d97UL,
+ 0x105ef594UL, 0xdaa41ba3UL, 0x7a9eefd8UL, 0x336530a2UL, 0x9d40f29dUL, 0xff23a54fUL, 0x7a04eb31UL, 0x22ad2c5dUL,
+ 0x46b4c285UL, 0x425e1c9eUL, 0x28f8c2edUL, 0xb7282b98UL, 0xbf6dec11UL, 0x5d7d1cf0UL, 0x953081abUL, 0x80470733UL,
+ 0x1078712dUL, 0x4e5420dfUL, 0x1399d2e3UL, 0x239d7545UL, 0x57601468UL, 0xc343041bUL, 0x55cb12f7UL, 0x4a5f6987UL,
+ 0xb8e46c37UL, 0xef6b4338UL, 0x42feb0f5UL, 0xc2ec5d4dUL, 0x7069fe06UL, 0x3f2b8eUL, 0xd14cbfcdUL, 0xa40b02e5UL,
+ 0x7ea2c739UL, 0xf9d8944bUL, 0xaadc629eUL, 0x64c18ca9UL, 0x48908cc4UL, 0xe845a468UL, 0xb70f33c6UL, 0xcec701c0UL,
+ 0x59f9717fUL, 0x92d69a82UL, 0xb40b22d2UL, 0x3704904dUL, 0x120a9e51UL, 0x431b6f64UL, 0x55b025e2UL, 0x8ee5241cUL,
+ 0x8c3134b4UL, 0xd80b4e71UL, 0xcf989c23UL, 0x4cf98464UL, 0x37889d45UL, 0x38c63110UL, 0x37d9ea83UL, 0x896628b0UL,
+ 0x913d2469UL, 0xd14a2fddUL, 0xf3651eccUL, 0xb7ad834aUL, 0x583f68a0UL, 0xffb30bbdUL, 0xaaef0530UL, 0x93a59bbeUL,
+ 0x7d82f952UL, 0xf64dcac9UL, 0xbdd04d4eUL, 0x398f8b44UL, 0xa7d51c49UL, 0x52e00041UL, 0x2bdd03d1UL, 0x1dbb12daUL,
+ 0x95c7c4fcUL, 0x3265c3a9UL, 0x386351a5UL, 0x3c0bca65UL, 0x6862a0c2UL, 0x529dbfbUL, 0x4bd2d0ecUL, 0xbaa9ed33UL,
+ 0x931227f3UL, 0xc83eae8aUL, 0x5f6a250cUL, 0x864f225bUL, 0xd0ddd88fUL, 0xd6a77e4dUL, 0x8864c103UL, 0x13395470UL,
+ 0xad2dce2dUL, 0xdb7cdb2aUL, 0xae8bc8d7UL, 0x1d082dffUL, 0xca56c24UL, 0x4f3918c4UL, 0x91908e95UL, 0xde9dad55UL,
+ 0xedd21e0cUL, 0xac45fcceUL, 0x61139bd2UL, 0x94a30ac8UL, 0x60a4ee41UL, 0x24d46856UL, 0xc05d175bUL, 0xa5ae8fd3UL,
+ 0xef6e5a67UL, 0x233357c6UL, 0x6b079a01UL, 0x37812969UL, 0x4ee0e81fUL, 0x53b4c1d7UL, 0x930779f1UL, 0xd61cb0c4UL,
+ 0xec9cbeeaUL, 0x4a44893dUL, 0xff4fbda4UL, 0x2e01a3aUL, 0x1a115b94UL, 0x989936b8UL, 0xc7aa4e12UL, 0x4bf2627fUL,
+ 0xa152e9b5UL, 0x13de77fbUL, 0x734641b8UL, 0x5571f73bUL, 0x236ebcb7UL, 0xd3800865UL, 0x78ce4db2UL, 0x19c83daaUL,
+ 0xfec78b9aUL, 0x7ac68acUL, 0xde6c4d59UL, 0xbe778791UL, 0xd732781fUL, 0xf440434eUL, 0xde0167e0UL, 0xc0c8af4fUL,
+ 0x3644091cUL, 0x4d3bc7fdUL, 0xa0ff5b5dUL, 0x424ec2fbUL, 0x81c5d6dfUL, 0xfe86162eUL, 0x3332f3dfUL, 0x4e9020a9UL,
+ 0x7006ba49UL, 0x7f7cdbbaUL, 0xd714906dUL, 0xf4c6f64dUL, 0xed1b3a9bUL, 0x3bce01d1UL, 0x826af4e8UL, 0xb7a3294aUL,
+ 0x61e64d2dUL, 0xa2ef269bUL, 0x9f18905bUL, 0x3bdda9b3UL, 0x584be6d1UL, 0x14497513UL, 0xfcd26c10UL, 0x9b43a43UL,
+ 0x211f8086UL, 0x1a45561cUL, 0xacb43874UL, 0xb4de718bUL, 0x38068d23UL, 0x560ebacbUL, 0x214a2cb0UL, 0x1be84ff2UL,
+ 0x4acbc495UL, 0xd3e49dd5UL, 0x3779c704UL, 0xd9a8e02dUL, 0x77c3d5f1UL, 0xf0f47e52UL, 0x5a3e7297UL, 0x79079e1UL,
+ 0xc6ad171aUL, 0xcef9df55UL, 0x40defc27UL, 0x70c36128UL, 0xd4595778UL, 0xfcda2664UL, 0x2a706caaUL, 0xa3414aeUL,
+ 0x1d45e17bUL, 0x55517c44UL, 0x2740c5b9UL, 0x7c1a153fUL, 0x64032745UL, 0x1a86f24fUL, 0x3d52a93bUL, 0x25894ef5UL,
+ 0x80ed86a4UL, 0x2c7f538bUL, 0x5c446de0UL, 0x4bcc587cUL, 0x84bc3044UL, 0xea006dceUL, 0xa8bcdeb1UL, 0x1ac94d1eUL,
+ 0x6682830cUL, 0x350aea34UL, 0xea4e864cUL, 0xa833d3dUL, 0xecc57bc9UL, 0xebcd6500UL, 0xeba0f7afUL, 0xa7c9887cUL,
+ 0x6040a867UL, 0x3e929cf1UL, 0x7c683276UL, 0xbb01f175UL, 0x66f8c749UL, 0x9a0d682fUL, 0x302a0fb9UL, 0xd8fa2406UL,
+ 0xfb388bc8UL, 0x2b8f9d7fUL, 0xd78fd673UL, 0xcd3daae7UL, 0xf24806bbUL, 0x5482083UL, 0x291279d6UL, 0x7c58d8beUL,
+ 0xc146b859UL, 0x5b31170cUL, 0xc035d677UL, 0x8bcc4ac3UL, 0x846039a7UL, 0xedac5410UL, 0xb9bf8179UL, 0x9f37aa2eUL,
+ 0x6cbb6143UL, 0x5fec6b1aUL, 0x14d63ca5UL, 0xb5e560e5UL, 0x5ff395c6UL, 0x7fa3c0ccUL, 0xd29a5e71UL, 0xc6a578f4UL,
+ 0xb5f9bb21UL, 0x7f9cde3UL, 0x52becf82UL, 0xab9d1c29UL, 0xc8b2abe1UL, 0xc2d344dUL, 0xae450964UL, 0xccd57ef3UL,
+ 0x19e6fa61UL, 0xd20c2871UL, 0xf933f543UL, 0xd03be12aUL, 0x98b555dfUL, 0x38cf9814UL, 0x789006ffUL, 0x8221ef1cUL,
+ 0xec4e9281UL, 0x6cf40157UL, 0x6966aaddUL, 0x84559ea3UL, 0x9730ab79UL, 0xf609157aUL, 0x427ca199UL, 0x97256333UL,
+ 0xb47877a9UL, 0x4aba992eUL, 0xf382e22UL, 0x8e77a607UL, 0x8c42ae9UL, 0xbf099c97UL, 0xb6d68fa1UL, 0x408e8e3fUL,
+ 0x270f3eebUL, 0x5004b5ecUL, 0x28798ac3UL, 0x176b94baUL, 0xdb50920cUL, 0xbb8592f5UL, 0x99090040UL, 0x6e70cf16UL,
+ 0x42a25628UL, 0x14a748f9UL, 0xdecb0170UL, 0xc585c0aUL, 0xf81f3c74UL, 0xcaf0f1d6UL, 0xff5938daUL, 0x42bca277UL,
+ 0x79168fd0UL, 0x2f5cfb40UL, 0x29cce746UL, 0xa2261473UL, 0x4950e2d2UL, 0x1ac756f6UL, 0x7a7b8c86UL, 0x3e1976dUL,
+ 0xf3f26392UL, 0xa6c31aa4UL, 0x24a01eeeUL, 0x8d7e0837UL, 0xe69e57e6UL, 0x8e346c2eUL, 0x7e9cf87aUL, 0xff0ec8b8UL,
+ 0x3f8fcfa5UL, 0x7faa0643UL, 0xa98845e9UL, 0x263880bdUL, 0x7a4ad1a1UL, 0x94f720e8UL, 0x79cbbbf6UL, 0xd60fbbf2UL,
+ 0x4f65cce1UL, 0x568d2ccUL, 0x4e94ab62UL, 0x77466d0aUL, 0xcb1afb03UL, 0x44c0aaa3UL, 0x7b2d54ecUL, 0x9c1f5330UL,
+ 0xd7f0aaeaUL, 0x7452858fUL, 0xc75ab33aUL, 0x59bb702dUL, 0xcfc7917bUL, 0xee322869UL, 0xb12f5b8bUL, 0x3befd08cUL,
+ 0xb98102a6UL, 0x4bc2d8b4UL, 0x7cf97d65UL, 0x700fe452UL, 0x1acc709fUL, 0x23494b34UL, 0xc5b4a5e0UL, 0x950f77a7UL,
+ 0x47072115UL, 0x6da0a279UL, 0xf7043e82UL, 0x323eb2d9UL, 0xb885b639UL, 0x5a09becfUL, 0x467a0d4bUL, 0xb8e7e2eaUL,
+ 0x1bb45562UL, 0x7d85fca2UL, 0x3f7dbe2bUL, 0x56c52UL, 0xcd40d0d1UL, 0x6ccf757eUL, 0x68ab40aaUL, 0xd366730cUL,
+ 0x2b57473cUL, 0xb271ca8dUL, 0x53b1ddfdUL, 0xae5e7a21UL, 0x7bcc6a6eUL, 0x434c371aUL, 0xcb398401UL, 0x28d38f2aUL,
+ 0x1bf59d9fUL, 0x7e5b26feUL, 0x970f8cfeUL, 0x9ca0ffdbUL, 0x5f06be51UL, 0x4332c65dUL, 0xe20c566UL, 0xca37a403UL,
+ 0xeda4481UL, 0x601107c5UL, 0x43c634f0UL, 0x55614d0dUL, 0xe0442ed5UL, 0x1a33a6f6UL, 0xc7dff42eUL, 0xc53b8468UL,
+ 0x6d788067UL, 0x43be13c0UL, 0x7575fd1fUL, 0xe3112aUL, 0xaa8f6cd2UL, 0x83ad8441UL, 0xe7098861UL, 0x45acbe88UL,
+ 0x84e6de3aUL, 0xf4b94deaUL, 0xde8882b6UL, 0xe37622e4UL, 0x3f91a90eUL, 0x5813d8e4UL, 0xf0001f50UL, 0xd34eecbaUL,
+ 0xb3b328ccUL, 0xbae8a09cUL, 0xb3ec583dUL, 0xbce887a3UL, 0x5d885aeaUL, 0x3d921fadUL, 0x182e437fUL, 0xd518f167UL,
+ 0x1a83ee88UL, 0xad58252dUL, 0xec11c1f4UL, 0x61abf256UL, 0x638373fdUL, 0x10ba6043UL, 0x35fd364cUL, 0x8fb14481UL,
+ 0x6fa6f112UL, 0x6fed6384UL, 0xef436b30UL, 0xb790c7b6UL, 0x935a6266UL, 0xb26c0038UL, 0x3e17b33bUL, 0x17a1b177UL,
+ 0x3de0437cUL, 0x2bf372bfUL, 0xeec76d71UL, 0xd5e932e4UL, 0x54f21204UL, 0x40750ffcUL, 0x3a3539caUL, 0x3ea8677dUL,
+ 0x8ae2250bUL, 0x88fd9c28UL, 0x5c951d3fUL, 0x3fb54139UL, 0x739e7563UL, 0x474c1dbbUL, 0xa842611dUL, 0x85610bfdUL,
+ 0x4dab236cUL, 0xf042ba6eUL, 0xf4065fdfUL, 0xa94e9df5UL, 0x242473daUL, 0x3a54f7efUL, 0x9137cfbbUL, 0xb5d17d8fUL,
+ 0x6608da99UL, 0x5fe55ce4UL, 0x738b3426UL, 0x437ac292UL, 0xc58310c5UL, 0xe482a7bfUL, 0x6ec23bUL, 0xf35e4606UL,
+ 0xb55d520UL, 0x99a8e097UL, 0x57f59138UL, 0x183588f8UL, 0x3fb120c8UL, 0xa0ee057bUL, 0x679ca1bUL, 0x3cf918f5UL,
+ 0xb308ab62UL, 0xb425dc88UL, 0xce05ba50UL, 0xc01f2c55UL, 0x12f301e1UL, 0x7f1259e5UL, 0xa0df3b43UL, 0x88442ea9UL,
+ 0xa8be8052UL, 0x91eebee6UL, 0xd0546614UL, 0x649f88f0UL, 0x50015c8dUL, 0xaa9c47a7UL, 0x76de019bUL, 0x90c908e1UL,
+ 0x13d36637UL, 0x7206800dUL, 0x4339bedeUL, 0x175dc3cdUL, 0xd2fb7bbUL, 0x7f6066eaUL, 0xa5a48190UL, 0x1cf0e759UL,
+ 0xc97f31f3UL, 0xa19c1c34UL, 0xf893df1bUL, 0x3d7ec2e7UL, 0x77f86065UL, 0xa3449096UL, 0xae2930e3UL, 0xb0b49030UL,
+ 0xce14b85dUL, 0x396c7d0cUL, 0xbec2e831UL, 0xd0dec7aeUL, 0xf6651ad2UL, 0xb6f11252UL, 0x7ccdd525UL, 0x59541caUL,
+ 0x96b5371dUL, 0xc9ef702dUL, 0xb2dea96eUL, 0xd2fee636UL, 0xbfff9085UL, 0xb2305ba1UL, 0x2182db21UL, 0xcf5c40abUL,
+ 0x350f7e2cUL, 0x19c4ac2bUL, 0x3eadbbcbUL, 0xea15ec91UL, 0x8ec2419dUL, 0x6cae47dbUL, 0x6504282cUL, 0xca1e466aUL,
+ 0xec570e6aUL, 0xad9cf1e6UL, 0x2655f283UL, 0x3063a251UL, 0x22080a6aUL, 0x49812735UL, 0x9bc523ffUL, 0xdcfa2215UL,
+ 0x1a63e064UL, 0x14393209UL, 0x67b34e41UL, 0xdde82f6cUL, 0x8a95cba2UL, 0x642edad8UL, 0x14d28b12UL, 0x49b40e0UL,
+ 0x9e1a7743UL, 0x87284dc1UL, 0x6090aa23UL, 0x62d3f32UL, 0x9b8800b6UL, 0x4274b71bUL, 0xa2835cc2UL, 0x1d4ab4ddUL,
+ 0xac28acf1UL, 0xd794a2dcUL, 0x885c9654UL, 0xa6bdf6caUL, 0xadf565daUL, 0x9daa28beUL, 0x3b8ad113UL, 0xf026512fUL,
+ 0xa80e724aUL, 0xfb1a3cfbUL, 0xc20af6c7UL, 0x6a7b9deUL, 0x1298710cUL, 0xa8ec9d5dUL, 0xb2db3585UL, 0x2b200300UL,
+ 0x74192c08UL, 0xcae3733eUL, 0xa00ebb86UL, 0x1dcb57cUL, 0x41f00e1bUL, 0x7877243eUL, 0x1e408f04UL, 0x9d005dcdUL,
+ 0xd79ad65cUL, 0x92f2d2e8UL, 0xc47fd042UL, 0xc5ce2558UL, 0x7e2c3075UL, 0x50421874UL, 0xd8823b6fUL, 0xa43803dbUL,
+ 0xec3dc976UL, 0x71bc924eUL, 0xefb67fefUL, 0x75e54322UL, 0xf593a0a9UL, 0x6b421234UL, 0x8f89078UL, 0x8ba82418UL,
+ 0xa1fb1ed1UL, 0x16d7f9c0UL, 0x50cedeb5UL, 0xf00b960eUL, 0xf828014cUL, 0x942a9ebdUL, 0x6df7765eUL, 0x99a4805UL,
+ 0x2dcf798dUL, 0x8dc26c4aUL, 0x4aa91b45UL, 0x4f787df3UL, 0x10420d89UL, 0x615646e0UL, 0xe69e47d9UL, 0x65c60bdUL,
+ 0x384da286UL, 0x9f704f6fUL, 0x7dbdbb31UL, 0xdd7ec729UL, 0x506cd4a1UL, 0x1987cfb1UL, 0xc9c0e620UL, 0x967001aaUL,
+ 0xd2bf304dUL, 0x509f5c73UL, 0xd3a40f20UL, 0x7ff9ab63UL, 0xdee4dc3dUL, 0x483d65b1UL, 0xeb069b14UL, 0xbaef6a9dUL,
+ 0x2fb2382UL, 0xee80d5e6UL, 0x2843544dUL, 0x146203fbUL, 0xc4147ddcUL, 0xcd6b49c6UL, 0x262c8622UL, 0x2458991cUL,
+ 0xe68cbefbUL, 0x63f8010fUL, 0x22a34e59UL, 0xa69c2c99UL, 0x816e5fdaUL, 0xc14d505cUL, 0x3e70810fUL, 0xf4b58a9eUL,
+ 0x3fbfb47UL, 0xe4e3dfb5UL, 0xee70124UL, 0xa826ff06UL, 0xa1ec318UL, 0xdfa40e8dUL, 0x5024c881UL, 0x5ea048d4UL,
+ 0xe7a085abUL, 0x9835b955UL, 0x260c863dUL, 0x712d1501UL, 0x5a820f28UL, 0xf31e47dfUL, 0x77f5e308UL, 0xc7afcd66UL,
+ 0xf240c438UL, 0x32e94393UL, 0x5dcdda0eUL, 0x9fd14c3eUL, 0x9bbf0ea9UL, 0x84d309d1UL, 0xc121accfUL, 0xf64e5c9fUL,
+ 0x6d7ae8d7UL, 0x928c1d1bUL, 0x4a75bbd0UL, 0x68e5ca0aUL, 0xd3f847b8UL, 0x7b06ca0eUL, 0x850806ffUL, 0xa19e549eUL,
+ 0x578fb9d8UL, 0xcd49623aUL, 0xcf182eb3UL, 0x87fe1cadUL, 0x2a0cea87UL, 0x8ee9015cUL, 0x78b39f47UL, 0xfbad7c7cUL,
+ 0x96dff79eUL, 0x44385b08UL, 0xd0d71baeUL, 0xd5232112UL, 0x55e8df4eUL, 0xa7dc4934UL, 0xd4cbaf9cUL, 0x308dc7d4UL,
+ 0xa4b01871UL, 0xb19909efUL, 0x761b5ae2UL, 0xf1965fbaUL, 0x217fa0caUL, 0x21d3b0ebUL, 0x4cf1c2c7UL, 0xaf828dd5UL,
+ 0x25c7331dUL, 0x1e4dfa17UL, 0x214116feUL, 0xad3266cUL, 0xeddac03cUL, 0x3851ecceUL, 0xcadf9d45UL, 0x166cc5baUL,
+ 0x8e19a57eUL, 0x984cfc46UL, 0x8db0db70UL, 0xd81dca65UL, 0x14e0bd61UL, 0x85b9e15eUL, 0x707eebeeUL, 0x85885c66UL,
+ 0x398a012fUL, 0x9ac6f7edUL, 0x14c9c941UL, 0xd776d316UL, 0x5be9a04aUL, 0x84c159d9UL, 0x7fe5a3a8UL, 0xfc471da6UL,
+ 0xc47addaeUL, 0x98640a2eUL, 0x5b568450UL, 0x1cb74cf5UL, 0x2732b264UL, 0xd5443fd8UL, 0x9a9107fdUL, 0xbe035422UL,
+ 0x57d898a7UL, 0x3e177e96UL, 0x8a1c54b1UL, 0xb8b64372UL, 0xf001a87eUL, 0xf5ac097fUL, 0x20da4441UL, 0x70f4e3deUL,
+ 0xe9c1ac7fUL, 0x150465eUL, 0x33a8f96UL, 0x8fc05ac7UL, 0x28de0bfUL, 0x6adceb1bUL, 0xa6a1dccdUL, 0x427db327UL,
+ 0x8be06edeUL, 0x293ff499UL, 0xf210ecf0UL, 0x8735d4d7UL, 0x51e7a27dUL, 0x440aeba5UL, 0x99639eacUL, 0xa4d3eb0bUL,
+ 0xb35aa4c4UL, 0xb79a9726UL, 0x89cb373cUL, 0x3b553833UL, 0x11dee768UL, 0x464c61c8UL, 0x99d0e996UL, 0xbae46808UL,
+ 0x7e02595aUL, 0xefe474f4UL, 0x9f7e7e9aUL, 0x340e1d54UL, 0xe7624e19UL, 0x6dd21b1cUL, 0xd090c93dUL, 0x7dc5d93dUL,
+ 0xc237a2cfUL, 0x46c18052UL, 0xd09cfbc6UL, 0x257ac3a8UL, 0x6e2a33caUL, 0x9adb0664UL, 0x78a9d67fUL, 0x218c12cUL,
+ 0xe42e5931UL, 0xb5ab9c95UL, 0x6d946d87UL, 0x999801dUL, 0x576ada22UL, 0xd55c1c9bUL, 0x7a631719UL, 0x8166adc2UL,
+ 0xd73c111aUL, 0x9040d46eUL, 0x9d3b7a6dUL, 0xe54aa69dUL, 0x65390c9bUL, 0x14ff922bUL, 0x947c624bUL, 0x52fa114eUL,
+ 0x4b887f56UL, 0x6ca3b79cUL, 0xd8a0b2d9UL, 0x98aa392cUL, 0x59bd58d0UL, 0x58e3ecdcUL, 0x3c427202UL, 0x67039b43UL,
+ 0xd062687dUL, 0xfe330c9aUL, 0x523c89a8UL, 0x66a848c3UL, 0xc9954250UL, 0x70ed13ddUL, 0x9b2483bfUL, 0xdca2381bUL,
+ 0xc31b41e8UL, 0x8d40925dUL, 0x72f66936UL, 0xb2f4b5e7UL, 0xbaa3cf8eUL, 0x711c68e1UL, 0x6474eb32UL, 0xd350f82UL,
+ 0x9b371caeUL, 0xa4396674UL, 0xe769101eUL, 0xcff01dd3UL, 0x2a6bf360UL, 0xa57cfae7UL, 0xb3119fa2UL, 0x88461f6bUL,
+ 0xdf7e2280UL, 0xda1c9605UL, 0x9214016aUL, 0x6333efd5UL, 0x98d80f5bUL, 0x49a2ce54UL, 0x6fe2ae1aUL, 0x3b667d89UL,
+ 0xcd710b25UL, 0xd673630fUL, 0xcb3fcb1dUL, 0x8d4a4680UL, 0x408a4fe5UL, 0x39257b69UL, 0xd9a78046UL, 0xa79fcab8UL,
+ 0x50eebe3bUL, 0x2c72265bUL, 0xe24ebedbUL, 0x25b99faUL, 0xbcfa80cdUL, 0xb5dd126dUL, 0x59a4de09UL, 0x9d7494f8UL,
+ 0xd09222a3UL, 0xdfb9bc75UL, 0x5d9ca86UL, 0xe6274291UL, 0x1fda2140UL, 0x349fc645UL, 0x42669e19UL, 0xc22aae3cUL,
+ 0xc104947bUL, 0x3f11558bUL, 0xedc8fa6fUL, 0x93563bebUL, 0x30b22b1bUL, 0x32ad8f63UL, 0x365db12aUL, 0xe1021998UL,
+ 0x88cdb929UL, 0x692a0df7UL, 0x12197f7bUL, 0xa78cacd0UL, 0x605d5b61UL, 0x40898492UL, 0x3d8d3f46UL, 0x7019f6f2UL,
+ 0x2128387fUL, 0xff76d330UL, 0xf89ac4b7UL, 0x8c4a231eUL, 0xb9fced81UL, 0xac87f611UL, 0xf1a46ee0UL, 0xfef005d1UL,
+ 0xc1ce7ddeUL, 0x5a7c3b92UL, 0xfa52cc0bUL, 0x3fb7a833UL, 0x635316c3UL, 0xefcf1aebUL, 0xbc8515c5UL, 0x5578b267UL,
+ 0xb0d16684UL, 0xec8b2b02UL, 0x5d9ab553UL, 0x747f55a9UL, 0x64556b6aUL, 0xd1edb24bUL, 0xc8dc1767UL, 0x4b85ae0bUL,
+ 0xfc32a5d4UL, 0x76948839UL, 0x4d12f866UL, 0x3b27ad6UL, 0x44f63183UL, 0x21d9b3cdUL, 0xec8c8ffcUL, 0xd11e5480UL,
+ 0x8161415dUL, 0x4e126190UL, 0x6fcab634UL, 0x337ecd5dUL, 0xac0adb2cUL, 0x656cd5cbUL, 0x38d7d8e0UL, 0x42c67819UL,
+ 0x59abd274UL, 0xd3800354UL, 0xa4bfbc50UL, 0xfa1f072cUL, 0x31f11eeeUL, 0x73a4cb73UL, 0x17d5fb56UL, 0xe09f9e96UL,
+ 0x10531d5bUL, 0x732776c9UL, 0x874b65e8UL, 0x165eee90UL, 0x9b519dcfUL, 0xc279438dUL, 0xa580cbbdUL, 0x163b9ab1UL,
+ 0x5244956fUL, 0x3848860aUL, 0xd9b69f68UL, 0x3aaa418dUL, 0x15cb9111UL, 0x222ad381UL, 0x6ec2f292UL, 0x12c5df9fUL,
+ 0x867cfb46UL, 0x2d7e42d6UL, 0xfe97c60eUL, 0x6c77bbd2UL, 0x2f5d752bUL, 0xb6de1c4cUL, 0xf67700adUL, 0xbbd6002dUL,
+ 0x300678c6UL, 0xafa38b09UL, 0xaff50805UL, 0x3ec4b700UL, 0xcf915f6aUL, 0xba9ccc3eUL, 0xc0ba4a5eUL, 0x4b986607UL,
+ 0x14467facUL, 0xa64c38bdUL, 0xf927efc0UL, 0x23d4dd45UL, 0xf4584ff0UL, 0xc1c83918UL, 0x777646baUL, 0x263cdd4aUL,
+ 0x42ba717cUL, 0x75e881dbUL, 0x7c9d165cUL, 0xb0beb927UL, 0xf3602827UL, 0x473b2022UL, 0x8d4eb837UL, 0xbbc0059eUL,
+ 0x31179629UL, 0x1aecebfcUL, 0x20bb5d08UL, 0x43b9e92dUL, 0xb16f68d3UL, 0x459b5af8UL, 0x193f0430UL, 0x6f46d5fbUL,
+ 0x56f50e8fUL, 0x8d996588UL, 0x2f049b25UL, 0x7dd58b48UL, 0xca66cdefUL, 0xeea15784UL, 0x403c434eUL, 0x12f7a590UL,
+ 0x6f1d8805UL, 0x41480465UL, 0x3bd562f1UL, 0xdde36114UL, 0x74241ba0UL, 0x5e384307UL, 0xc03614faUL, 0xef2c92feUL,
+ 0xf95d56e0UL, 0x95b5b7a5UL, 0xd876dac3UL, 0x5f3fb3dUL, 0xe7c24aaeUL, 0x1f501a89UL, 0x1d7055c9UL, 0x49e36e95UL,
+ 0x77ed8740UL, 0xf40a6e55UL, 0x2aa61771UL, 0xfa848710UL, 0x7b64eb45UL, 0xb859d69cUL, 0xbe4d4205UL, 0x32840466UL,
+ 0x8c501866UL, 0x2a686853UL, 0x81336eeeUL, 0x3c9f7e33UL, 0x35b84473UL, 0xc3945d6UL, 0x6f69bd10UL, 0xc57b6a67UL,
+ 0xd146e999UL, 0xbea31eb3UL, 0xe5d5b368UL, 0x2c55145fUL, 0xdbdb4f1UL, 0x7358a923UL, 0x3a69ea6fUL, 0x5370963bUL,
+ 0x5c2357c6UL, 0x4ff24f25UL, 0x9a1c735dUL, 0x8005df80UL, 0x5d0c4218UL, 0xe2e47699UL, 0x9dd743fUL, 0x8ceab24UL,
+ 0x88e79884UL, 0xe030cf7UL, 0x540b2ca5UL, 0xe38f2cbaUL, 0x8bcf7a07UL, 0xf5ee7e44UL, 0xc946008cUL, 0x1b27efedUL,
+ 0x98535407UL, 0xbaecbea7UL, 0xdd942862UL, 0xc75f3d8cUL, 0x83fee7a2UL, 0x54953be7UL, 0xb38a871dUL, 0x16b027e9UL,
+ 0xdb0a2210UL, 0xcfce46c1UL, 0x4df867ecUL, 0x25b234afUL, 0xf49c6e6bUL, 0xf95fdb88UL, 0x9358433fUL, 0xf87ef7b8UL,
+ 0x7de5bcUL, 0xd4d4a6a4UL, 0x8cf0851dUL, 0x11f7279eUL, 0xc843aac6UL, 0xb344a447UL, 0x74b3b805UL, 0x870b03eaUL,
+ 0x4be832b4UL, 0xb412442aUL, 0xcf8593c1UL, 0x55f7dabaUL, 0xad674b73UL, 0x8d8e059eUL, 0x5d011cfeUL, 0x59d8a684UL,
+ 0xc5e4a7acUL, 0x125dfb01UL, 0x6c400edbUL, 0x31f41053UL, 0x30ec1941UL, 0xab9c134bUL, 0xdaddcf65UL, 0x99341faeUL,
+ 0xe0ee50e6UL, 0xab6e4e65UL, 0xdf04c0c7UL, 0x9fce4c35UL, 0x4d57e46dUL, 0x9afc7c8cUL, 0xbb51946aUL, 0xd85ad040UL,
+ 0x86709ef7UL, 0xa6211d27UL, 0x2ae66044UL, 0x8d9d96a8UL, 0x848e0f95UL, 0x54a47aa4UL, 0xed0d294dUL, 0x57bdd2b2UL,
+ 0x9246f2bUL, 0x8891148fUL, 0xa863a15eUL, 0x2dd2a929UL, 0x5cd115eUL, 0x397efce8UL, 0xbf993347UL, 0x260ca3caUL,
+ 0x3ae787fUL, 0x8ada24fdUL, 0x506ff6cdUL, 0x14c30cdbUL, 0xbc251f47UL, 0x2cd3d7b6UL, 0x25a565d3UL, 0x468c4501UL,
+ 0x5cc2edc7UL, 0xc3fffa04UL, 0x984d9345UL, 0x6c6eb373UL, 0x813aa3cUL, 0x6eb364d1UL, 0xf80a63acUL, 0x2165c31dUL,
+ 0xb6ce99bdUL, 0x65dc222bUL, 0xbca38b9bUL, 0x777aa71dUL, 0x2f375522UL, 0x3f51248bUL, 0x97fc6514UL, 0x4810786UL,
+ 0xac9cb8e1UL, 0xca36c8f4UL, 0x1268052dUL, 0x3a2bae80UL, 0x9e11b6e6UL, 0x2ec35ee2UL, 0x43fc0878UL, 0x9863addbUL,
+ 0xe7c9501aUL, 0x7fe7c32bUL, 0x9209ff2cUL, 0x1f3564c3UL, 0x898a1ffdUL, 0x8e4087d4UL, 0x56978a01UL, 0x56d36fb9UL,
+ 0xb2ed1bf3UL, 0x3f5195f3UL, 0xb53f001bUL, 0x5225e0eeUL, 0xa12e5fc9UL, 0xaa90a96bUL, 0xb3182834UL, 0xdd4d1daUL,
+ 0x6f61c366UL, 0x5a0f7918UL, 0xa21d1f29UL, 0x923a1870UL, 0x138ffcd0UL, 0x3fb0abc9UL, 0x5857e7baUL, 0x44753fb0UL,
+ 0xaf823909UL, 0xe5de9aedUL, 0x8f2e68f1UL, 0x629660d2UL, 0x516b4UL, 0x5dde7456UL, 0x5fc3fa4fUL, 0x845f62dcUL,
+ 0x3be4df40UL, 0x4273cd93UL, 0x16182e4UL, 0xb12532bbUL, 0x806cf5b6UL, 0x5620ef75UL, 0xed19db39UL, 0x2f4aa635UL,
+ 0xcb4144d5UL, 0x5416a132UL, 0x83845305UL, 0x6917de7dUL, 0x60592955UL, 0x6e8d73f8UL, 0x9b9ee7eaUL, 0x94f5cc6bUL,
+ 0x212b3259UL, 0x416b2ef8UL, 0x2c7381acUL, 0x3d728314UL, 0xeb3325faUL, 0xa53789e8UL, 0xdcece7c8UL, 0x7cb6ff78UL,
+ 0xe5f22626UL, 0x36a962f6UL, 0x26c131e4UL, 0xe4f437b5UL, 0x6cb71f7UL, 0x10a9c127UL, 0x5fc1587UL, 0x6a80ac5eUL,
+ 0x8221d382UL, 0x217a79b6UL, 0x687d75b5UL, 0x8447f35cUL, 0xd5483ab7UL, 0x1d251920UL, 0x40075b82UL, 0x760c263UL,
+ 0x19348563UL, 0x9ac09d63UL, 0x93349c94UL, 0x59e35116UL, 0x513d6cf8UL, 0x698669d8UL, 0x3542d9c2UL, 0xd9aa8021UL,
+ 0x49f09a48UL, 0xfb8b3860UL, 0x5ffc923aUL, 0xfac605e5UL, 0xc9dafbbUL, 0x87f678aUL, 0x27ec1547UL, 0xbe50fe64UL,
+ 0x305afd59UL, 0x9407bb24UL, 0xd5b5f855UL, 0x6c42a3c1UL, 0x30731decUL, 0x94e6f16aUL, 0x967846bUL, 0x7856be26UL,
+ 0xa8871931UL, 0xb1029b21UL, 0x17dfafbbUL, 0x71afbb62UL, 0x72ed7e1bUL, 0xf48a465aUL, 0x244a99eeUL, 0x68e2becfUL,
+ 0xdee4b333UL, 0x6d812a0eUL, 0x9e6ff946UL, 0xb33bf509UL, 0x5765c091UL, 0x9035ed8fUL, 0xbdaa0130UL, 0x4fcab2d3UL,
+ 0x13ea7c09UL, 0xbe405759UL, 0xb4b86ee7UL, 0x6d08b745UL, 0xa5944845UL, 0x53c3f506UL, 0xe1d64a7aUL, 0x6628944UL,
+ 0xae00b18aUL, 0x56a4b835UL, 0x87635463UL, 0x3d3e2856UL, 0x90276f8fUL, 0xafd32a7aUL, 0x5ad3019UL, 0x713454b5UL,
+ 0x60734f0aUL, 0x5fad2336UL, 0xde4d26c8UL, 0xdcf49088UL, 0x699478f0UL, 0x61a06ac6UL, 0xd6308078UL, 0x14b59524UL,
+ 0x9a7b2663UL, 0x38c93854UL, 0xe749c931UL, 0x362d19b3UL, 0x3a9ac73dUL, 0x2df3d440UL, 0x7dfde630UL, 0xb4c3394UL,
+ 0xc392de3aUL, 0xe01bb199UL, 0xa4ad57d5UL, 0x4b367a2dUL, 0x79a644fdUL, 0x292533c2UL, 0x51b5c7e7UL, 0x3f4230b4UL,
+ 0x5fc86fc4UL, 0x25320cfeUL, 0xf1f75be7UL, 0x10820623UL, 0xc1e8b896UL, 0xaf1259UL, 0x6d940fdbUL, 0x92f0b25UL,
+ 0x32ab0ce7UL, 0xf39d9198UL, 0xf45f3d33UL, 0x3194f627UL, 0xb0a82b58UL, 0x4ad4be81UL, 0x76823404UL, 0xa7ab8d3dUL,
+ 0xca4a05fcUL, 0x9114bbcdUL, 0xe3abdedaUL, 0xec00048cUL, 0x6d3a6e87UL, 0xfaae8999UL, 0x4cde996dUL, 0xff8099adUL,
+ 0x8586a3c2UL, 0x32f13b74UL, 0x4de01096UL, 0xf3fc8d66UL, 0x18031281UL, 0x12423d6UL, 0x62bb2ab4UL, 0xf1ab42fUL,
+ 0x993ce25aUL, 0x7c841a27UL, 0xe704bc24UL, 0x62daf827UL, 0xb7568748UL, 0x666bf22fUL, 0x9a0a1007UL, 0x7c035cfUL,
+ 0x46343198UL, 0x628e7869UL, 0xe9cfd16cUL, 0x8709dcfeUL, 0x961bc9a2UL, 0xb85fa35eUL, 0xf07904d2UL, 0xff52431fUL,
+ 0xf7ed723eUL, 0xe8515ba8UL, 0x66f8fed0UL, 0x7b65aa1eUL, 0x52f616f8UL, 0x5b834922UL, 0x99df8d50UL, 0x8b15b805UL,
+ 0x4840fc1bUL, 0x724ec4d5UL, 0xe49b26fUL, 0x2334bff6UL, 0xc3e47558UL, 0xbb287411UL, 0x220e8799UL, 0xd315f747UL,
+ 0x8a361b6bUL, 0x8a1d7585UL, 0x485ea4dcUL, 0x7f39581cUL, 0x25415888UL, 0x6db6446eUL, 0x1f2a1afdUL, 0xa7d29bf7UL,
+ 0x921d95cbUL, 0x1a10eb15UL, 0xf3ef5173UL, 0x7db43342UL, 0xcf22c4dUL, 0xd9590b95UL, 0x552c99a2UL, 0xa1adea34UL,
+ 0xa69b5f5dUL, 0x513654e7UL, 0x858aa423UL, 0x98eea7b5UL, 0x911b9441UL, 0xf64d8e8bUL, 0x967c764bUL, 0xed346903UL,
+ 0x53f90520UL, 0xcf488531UL, 0x253933bbUL, 0xc00166d6UL, 0x45931b68UL, 0x285b3f7dUL, 0xb283c9d0UL, 0x5b27f74cUL,
+ 0xdfa86fecUL, 0x5830e43dUL, 0x1c28734bUL, 0xe0413db1UL, 0xf2136f6bUL, 0xfa1a30bbUL, 0x5f665b38UL, 0x23c8644dUL,
+ 0x699e1c7eUL, 0x3bb7924UL, 0xafab4197UL, 0x613c22feUL, 0x2aeb6948UL, 0xa0887cdUL, 0x9437d25dUL, 0xca064843UL,
+ 0x871f99beUL, 0x46efe764UL, 0x916d1412UL, 0x9e87b9a9UL, 0x122fe8dcUL, 0x16e67d0bUL, 0xc9dfad0dUL, 0x15e192ceUL,
+ 0xfd4cdfa0UL, 0x9837a6bUL, 0x2fdca1c2UL, 0xd140f34aUL, 0x66c07fd7UL, 0xff53935dUL, 0xb6c466bfUL, 0xbb544246UL,
+ 0xfd333e9UL, 0xdd26fddbUL, 0xf3098b83UL, 0xc41815a3UL, 0x1ee7c938UL, 0xab904c25UL, 0x1174bd95UL, 0xb99f72d5UL,
+ 0xc5913b27UL, 0x753b2a7fUL, 0x7c3fa0daUL, 0xb549249cUL, 0x9a453603UL, 0x4fad655fUL, 0xcbd22284UL, 0x707011d3UL,
+ 0x40107943UL, 0xefc05725UL, 0x1aa08f05UL, 0x40bff9ecUL, 0x4a2d836UL, 0x26f15fb7UL, 0xf340253fUL, 0x9f0e36bcUL,
+ 0x686d95e3UL, 0xb2f73b30UL, 0x2a3ec616UL, 0xc02a118dUL, 0xdd8f8e7bUL, 0xb00bfc94UL, 0x33624b0fUL, 0x85eef11bUL,
+ 0x65c5b63eUL, 0x780a77cbUL, 0x704238aaUL, 0xdd6e5d42UL, 0xd7b9515UL, 0xe4fa4a2UL, 0xb8f0e76fUL, 0x44df5a2bUL,
+ 0xd9084106UL, 0xaab1ff30UL, 0x8d748a45UL, 0xe675ea70UL, 0xfb224b3fUL, 0x559256dfUL, 0xe6558951UL, 0xf0ae5d79UL,
+ 0xf4c724bfUL, 0xb2854f0cUL, 0x178833ffUL, 0x73d1b95cUL, 0x6f22b2e6UL, 0x1ecdd393UL, 0xa01b0215UL, 0x20e21fe7UL,
+ 0x521d26e9UL, 0x2724f509UL, 0x6d7d8ce8UL, 0xb26a670dUL, 0xc2db4c51UL, 0x509714ebUL, 0x81bf1ee6UL, 0x46f1343UL,
+ 0x93700279UL, 0xce65ce5eUL, 0xdd1c4397UL, 0x748c4b1eUL, 0x8991d792UL, 0x1512e9feUL, 0xde84b64fUL, 0xbb5c7475UL,
+ 0x7b291328UL, 0x3b685283UL, 0xb7a44b78UL, 0xc9ad3052UL, 0xaa0af83cUL, 0xf34789feUL, 0x7a981be4UL, 0x4ffa8fcbUL,
+ 0x8505028bUL, 0x4e5eecf7UL, 0x1cb05091UL, 0xd352a734UL, 0xf705c97dUL, 0x4ee92bf0UL, 0xa8a8aeefUL, 0x8b2a5d2dUL,
+ 0xee5a38e4UL, 0x514c2469UL, 0xe672b0d8UL, 0x6e67143UL, 0x168cfc34UL, 0x40f2f42bUL, 0x9718e20UL, 0x65aaef84UL,
+ 0x5889edadUL, 0xab1c203eUL, 0x79badfe5UL, 0x8f0e18b8UL, 0x92734b89UL, 0xe8abe404UL, 0x8f69471bUL, 0xb0f77f26UL,
+ 0xb906663UL, 0x3237c8cdUL, 0xe8e19d55UL, 0x8166aa68UL, 0x375f758aUL, 0x6b125b41UL, 0xb14f8e72UL, 0xc058a662UL,
+ 0x92d50c6fUL, 0x2faa7888UL, 0xd1238bf5UL, 0xf96873a0UL, 0xf141cb46UL, 0x7a1de5fbUL, 0x965494fdUL, 0x557cae42UL,
+ 0x16edaf0aUL, 0x3818f6e5UL, 0xd2fcdd27UL, 0x5dafaed9UL, 0x9628b624UL, 0x19b29e9bUL, 0xac70d8e1UL, 0x839b00afUL,
+ 0x8f73030dUL, 0xc1d9217fUL, 0x56b1b411UL, 0x2bba0883UL, 0xdc86eff2UL, 0xf3734a79UL, 0x58deaa29UL, 0xbbaef715UL,
+ 0x339a3aabUL, 0x705cd3f4UL, 0x71cc6c55UL, 0x6cb9be91UL, 0xabbe3991UL, 0x3b22e3bcUL, 0xa6802f76UL, 0x234ffdc8UL,
+ 0x2248fc40UL, 0xe7a8e6dfUL, 0xef769f70UL, 0xb2654586UL, 0x1381b5d0UL, 0xdd4d3a2aUL, 0xf906ea6UL, 0x579d7f71UL,
+ 0xf89d7e31UL, 0xc75096f3UL, 0x1cc05dcaUL, 0xf0936243UL, 0xdd4d072UL, 0xf1e4680UL, 0xdf1823d7UL, 0x3c0ad45fUL,
+ 0x774b1786UL, 0x8577092eUL, 0xda0a752cUL, 0xb5ae8d09UL, 0xfb983c5dUL, 0x3ae6afb4UL, 0xdd2e93a6UL, 0x6701ddUL,
+ 0xe354e548UL, 0x9ee31e6fUL, 0xe53b3718UL, 0xb86f2787UL, 0x500ffcacUL, 0x2f20be87UL, 0x11751e2UL, 0x7900bd66UL,
+ 0xcd028dd2UL, 0x20f1749eUL, 0x16fc8092UL, 0xd67726faUL, 0xf3ed86dUL, 0x45b5de2dUL, 0x4d65351fUL, 0xcc4ecde4UL,
+ 0x9d10a435UL, 0x3d9cea83UL, 0x4bb32c52UL, 0xab39c0ceUL, 0x126d0482UL, 0x8d82fae6UL, 0x3460dfd5UL, 0xc51f1e61UL,
+ 0x7ecb328cUL, 0x21838be9UL, 0x53a66265UL, 0xc46836b8UL, 0x4484b943UL, 0xb1611bc4UL, 0xe8049f4eUL, 0x1efb0c85UL,
+ 0xd68ed1e4UL, 0xe3ff76b3UL, 0x536bed8eUL, 0x630a9c43UL, 0x3c74dcabUL, 0xcbfb6318UL, 0x9902bdbUL, 0xcbd8e690UL,
+ 0x4a1f4b70UL, 0x3443e50bUL, 0x20949f1cUL, 0x597580e4UL, 0x1bf77016UL, 0xb7dec05cUL, 0x972b429fUL, 0x121a51bbUL,
+ 0x1b46c0a3UL, 0xe504c9a1UL, 0xeface8c2UL, 0xe85bf568UL, 0x5f20ad21UL, 0xf7e26a7bUL, 0xe5da58a6UL, 0x105ac363UL,
+ 0xd8829042UL, 0xd906ae31UL, 0x10cd29a4UL, 0xacd05fbcUL, 0xd4547f02UL, 0xf86e3c6fUL, 0xc4e8cbecUL, 0xf654067dUL,
+ 0xbb15b9b8UL, 0xccc7f7eeUL, 0xe2dbbbUL, 0xbcc7e4dfUL, 0xddf6352eUL, 0x68889e9eUL, 0xeda2aee9UL, 0xbef4c6abUL,
+ 0x366507c7UL, 0xb014683aUL, 0x4bc9f367UL, 0x6d054696UL, 0x1846058fUL, 0xf42544a9UL, 0xe96207caUL, 0x2484bfc7UL,
+ 0x303fed95UL, 0x9a90e742UL, 0x3d93dda8UL, 0xe698f91fUL, 0xcec17aUL, 0x9b101a71UL, 0xa49ed5c0UL, 0x5991494UL,
+ 0xcc591563UL, 0xd8c6c475UL, 0xe6ba21f0UL, 0xf3c136adUL, 0x4e4c8cfaUL, 0xdde8f610UL, 0x9d72aee1UL, 0x953a4170UL,
+ 0xa8367b58UL, 0xc6694d11UL, 0x7d5b2813UL, 0x39d603a1UL, 0x2f9378b0UL, 0x66ededabUL, 0x156a9633UL, 0xf49e439UL,
+ 0xe096c047UL, 0x2ac63319UL, 0x5f587d6aUL, 0x30ab0b6bUL, 0x175dd003UL, 0xd9fd87fcUL, 0x7d9deabUL, 0xc0cdf64dUL,
+ 0x107bfaafUL, 0xc77a5585UL, 0xefa9815eUL, 0x8db8bccdUL, 0x51903a37UL, 0x7d4cb2a3UL, 0x758b3c9UL, 0x64382748UL,
+ 0x7854e5e9UL, 0x63fd7c6cUL, 0x7ae86481UL, 0x11b774b2UL, 0x60ef92f5UL, 0x9fb68c79UL, 0x3ad9d1aeUL, 0x52886d98UL,
+ 0x210018dUL, 0x70b7b1b1UL, 0x520e6eb8UL, 0xdebadd57UL, 0x685e9703UL, 0xb8341b20UL, 0x2ea2f94dUL, 0xe10159aeUL,
+ 0x62ebd320UL, 0x957eda60UL, 0x135f83aaUL, 0xc944e3a4UL, 0xd1bb7357UL, 0x70f30918UL, 0x2cf4bb3UL, 0x2b62b6c5UL,
+ 0x2c2413f8UL, 0xeb912f35UL, 0xaa902c59UL, 0x72dd09caUL, 0x467c48bcUL, 0x8403349fUL, 0x7a0a7762UL, 0xc7dc0cbaUL,
+ 0x1ea592a1UL, 0x4ee7bcUL, 0x61d596ccUL, 0x837b8339UL, 0x83c2ad0dUL, 0x53214b42UL, 0xd14951feUL, 0x54e7fd1eUL,
+ 0x8b076983UL, 0xc87fca7cUL, 0xa8c61d6cUL, 0x5cd77700UL, 0x7d802effUL, 0xc431bc27UL, 0x787fcc44UL, 0x6ad8ba7bUL,
+ 0x541f5c3cUL, 0x551a9bd7UL, 0x1dd2de3aUL, 0xe281a02aUL, 0xb6d22ad3UL, 0x854072dfUL, 0x55209c27UL, 0x697e6817UL,
+ 0xcd3b4659UL, 0xe79f9e11UL, 0xb9281652UL, 0x4dbfe204UL, 0xfb5b1a49UL, 0xdc51e37cUL, 0x68a67f1aUL, 0xc0acd5bdUL,
+ 0x548e8ea0UL, 0xe1810696UL, 0x83dd1527UL, 0x2a832047UL, 0xa9635170UL, 0xa73c9b1bUL, 0x852c1639UL, 0x8bb4fb3aUL,
+ 0x8e0c4c4cUL, 0x43e0f0c7UL, 0x2787d3abUL, 0x10e5738dUL, 0x4eec9bb8UL, 0xf0832204UL, 0x81deb448UL, 0xdffcaf35UL,
+ 0x4f257b7dUL, 0x567915faUL, 0x1348db2cUL, 0xf256da75UL, 0x2e2b22a1UL, 0x1d07fcc5UL, 0xd88596f6UL, 0xb3f6375dUL,
+ 0xd513bf00UL, 0xca8ce6a0UL, 0xe9e8c2f8UL, 0xf315bd30UL, 0x30314d8fUL, 0x52fbd342UL, 0xd93ae2eUL, 0x2666ee57UL,
+ 0xab440815UL, 0x3189ed3aUL, 0xe877dd50UL, 0xc7c44eccUL, 0x38581febUL, 0x8162e03fUL, 0xb22b54d2UL, 0xfee06c31UL,
+ 0x5613cb3dUL, 0x1dc55725UL, 0x1820ce81UL, 0x871b1006UL, 0x904351a5UL, 0x940a8deaUL, 0xe4ebfdfaUL, 0xc6ae0999UL,
+ 0x5ac9434aUL, 0xe9ef182dUL, 0xd30ba65dUL, 0xfd76634dUL, 0x8147dd7cUL, 0x7f000945UL, 0x36df3703UL, 0xef57d4fcUL,
+ 0x7bbc3c42UL, 0x79938c29UL, 0xf8fcb421UL, 0xe990469bUL, 0x619f7d7dUL, 0x1b5fc389UL, 0xc6f54216UL, 0x4a2c88f7UL,
+ 0xcdbc7d2eUL, 0xd2e7dfdbUL, 0xb9ed8202UL, 0xad42d2beUL, 0x5e56c837UL, 0x9a1c7b88UL, 0x6f4d8005UL, 0x831331cbUL,
+ 0x7316ee88UL, 0xc629d32dUL, 0x45df0c0dUL, 0x9cb1f035UL, 0x5b0bbc23UL, 0xed3bd438UL, 0xd30530e9UL, 0xaae9c72dUL,
+ 0xc2a136c9UL, 0x108ae5c0UL, 0xabef9c81UL, 0x97086bf1UL, 0x7f543170UL, 0x780fac4bUL, 0x12818ab9UL, 0x6b93564bUL,
+ 0x2bd5cd9cUL, 0x36ef6db8UL, 0x23d5bcb7UL, 0x10285fbeUL, 0x43093275UL, 0xcec32ccfUL, 0x603d1e20UL, 0x611d843dUL,
+ 0x8f7947b9UL, 0x2d15c9daUL, 0x6fdc169bUL, 0x8f9ed5e5UL, 0x88d9e959UL, 0xf45924faUL, 0xf6fd97bdUL, 0xffdf0f04UL,
+ 0xe55f7e0bUL, 0x80ff36UL, 0x3495751eUL, 0xc4cc8572UL, 0x3417db82UL, 0xbe23f0b3UL, 0xfb3b6dddUL, 0xe0bece25UL,
+ 0x9c5ba7b6UL, 0xbd5fe17aUL, 0x588c5384UL, 0xf9bd2741UL, 0x7f4b9de1UL, 0x12559238UL, 0x53ddff52UL, 0x4686bd93UL,
+ 0x5eb1fe78UL, 0x96ee0820UL, 0xdcf2a53aUL, 0xf4013edUL, 0x747f9632UL, 0x6434c188UL, 0xe547033fUL, 0x21659ee1UL,
+ 0x14cf9fa3UL, 0x6cb14a2UL, 0x5380a24UL, 0x70c1cf6bUL, 0xe4ea160eUL, 0xff53c901UL, 0xdc249b0eUL, 0xb3e9cd67UL,
+ 0x5caf88bUL, 0x516b9ea0UL, 0x463d5024UL, 0xfb674bc5UL, 0x1f0406b3UL, 0x8516d5eeUL, 0x4559ccaaUL, 0x4068aff6UL,
+ 0x3b5c3035UL, 0xc399815fUL, 0xdfcd2c04UL, 0xbc109d0UL, 0x2a6400f0UL, 0xcdc76ba7UL, 0xd9131730UL, 0x367bb3a7UL,
+ 0x1df0a1bUL, 0xdcc575dbUL, 0x7869b90aUL, 0x4b0dabdeUL, 0x38a94b6aUL, 0xc7812b97UL, 0xaac750a9UL, 0x75f80bb0UL,
+ 0x2d9ba2a8UL, 0x3fa5cc89UL, 0xeae078e1UL, 0x6948afb9UL, 0xd4afed6fUL, 0xfcd5eb03UL, 0x72306bf3UL, 0x59724444UL,
+ 0x18d14fc3UL, 0x1bedce8UL, 0xa8125395UL, 0xe0c7f6deUL, 0xfe9f6b4dUL, 0xee95847aUL, 0xee8970fcUL, 0xb9ed33eaUL,
+ 0x2616d02eUL, 0x6487dc88UL, 0xaa383a03UL, 0x2ee18b10UL, 0x9cd67757UL, 0xef2382e9UL, 0xd893a5ceUL, 0x1ca247cbUL,
+ 0xd0f51c0fUL, 0x93e5a97dUL, 0x291457c6UL, 0x10963b29UL, 0x84d95963UL, 0xfc000283UL, 0x25629824UL, 0xa4a0f571UL,
+ 0x64576766UL, 0xb703300dUL, 0xd5181a4cUL, 0x67410bfUL, 0x2420fe12UL, 0x5fc773b9UL, 0xb5ead2a0UL, 0x727d3ce0UL,
+ 0x1bf74d0bUL, 0xacd3fa81UL, 0x46e41f2eUL, 0x156f4eddUL, 0x1ea4e459UL, 0xeafaf8a8UL, 0x6a532c13UL, 0x8839029dUL,
+ 0x204a4502UL, 0x985a33a6UL, 0xda502eb1UL, 0x8b918c4eUL, 0x80a17e66UL, 0x80265964UL, 0x9492eafbUL, 0x173aeb7dUL,
+ 0xebf08ccdUL, 0xfa5a5e9bUL, 0x1514341bUL, 0xf3fa901eUL, 0x7274c4deUL, 0x58450d39UL, 0x3d7994ddUL, 0x11e797e3UL,
+};
+#endif
diff --git a/lib/nettle/gost/ecc-gost512a-64.h b/lib/nettle/gost/ecc-gost512a-64.h
new file mode 100644
index 0000000000..a9cd1498c0
--- /dev/null
+++ b/lib/nettle/gost/ecc-gost512a-64.h
@@ -0,0 +1,559 @@
+/* For NULL. */
+#include <stddef.h>
+#define ECC_LIMB_SIZE 8
+#define ECC_PIPPENGER_K 43
+#define ECC_PIPPENGER_C 6
+static const mp_limb_t ecc_p[8] = {
+ 0xfffffffffffffdc7ULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL,
+};
+static const mp_limb_t ecc_b[8] = {
+ 0x503190785a71c760ULL, 0x862ef9d4ebee4761ULL, 0x4cb4574010da90ddULL, 0xee3cb090f30d2761ULL, 0x79bd081cfd0b6265ULL, 0x34b82574761cb0e8ULL, 0xc1bd0b2b6667f1daULL, 0xe8c2505dedfc86ddULL,
+};
+static const mp_limb_t ecc_q[8] = {
+ 0xcacdb1411f10b275ULL, 0x9b4b38abfad2b85dULL, 0x6ff22b8d4e056060ULL, 0x27e69532f48d8911ULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL,
+};
+static const mp_limb_t ecc_g[16] = {
+ 0x3ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x89a589cb5215f2a4ULL, 0x8028fe5fc235f5b8ULL, 0x3d75e6a50e3a41e9ULL, 0xdf1626be4fd036e9ULL, 0x778064fdcbefa921ULL, 0xce5e1c93acf1abc1ULL, 0xa61b8816e25450e6ULL, 0x7503cfe87a836ae3ULL,
+};
+static const mp_limb_t ecc_Bmodp[8] = {
+ 0x239ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+};
+#define ECC_BMODP_SIZE 1
+static const mp_limb_t ecc_Bmodq[8] = {
+ 0x35324ebee0ef4d8bULL, 0x64b4c754052d47a2ULL, 0x900dd472b1fa9f9fULL, 0xd8196acd0b7276eeULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+};
+#define ECC_BMODQ_SIZE 4
+#define ecc_Bmodp_shifted ecc_Bmodp
+#define ecc_Bmodq_shifted ecc_Bmodq
+static const mp_limb_t ecc_pp1h[8] = {
+ 0xfffffffffffffee4ULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0x7fffffffffffffffULL,
+};
+static const mp_limb_t ecc_qp1h[8] = {
+ 0xe566d8a08f88593bULL, 0x4da59c55fd695c2eULL, 0xb7f915c6a702b030ULL, 0x93f34a997a46c488ULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0x7fffffffffffffffULL,
+};
+#define ecc_redc_ppm1 NULL
+#define ECC_REDC_SIZE 0
+#if USE_REDC
+#define ecc_unit ecc_Bmodp
+static const mp_limb_t ecc_table[2048] = {
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x6abULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0xf0ef44e972ca9068ULL, 0xdb1d62d6a9ef2729ULL, 0x9b0da4dc9f7c7ffdULL, 0xd83c1cff65ca0c69ULL, 0x9c60781a47aeec48ULL, 0xaf2d843b6526c102ULL, 0x33317add0d67d100ULL, 0x15791bb84e1893fcULL,
+ 0xce2680c9d223389aULL, 0x125b2f67d5d1e9d0ULL, 0x228c429232a49ab1ULL, 0xc03135b7bec9d296ULL, 0xc73395761870b908ULL, 0x76145f11aa5d2de2ULL, 0x65f4bb32a152f4faULL, 0xb454b08e14f5610cULL,
+ 0x4a102a1b4637f438ULL, 0xdfe518e3ec614523ULL, 0x2c7cc07ff04ff681ULL, 0x9d29613bc043a693ULL, 0x71b20d1973f413a1ULL, 0xb60dfc63a52606e7ULL, 0x7eab6739f89a4bf8ULL, 0x4715599107540d3cULL,
+ 0x3f6087c57d24d20cULL, 0x46e6737d8f70275dULL, 0x571f24831ff30d56ULL, 0x11fb75296c0c4db4ULL, 0xfe3dd212db1c5b98ULL, 0x7bb916b38b2f7ccaULL, 0x289ce20e0609ed33ULL, 0x8907864cf23f75a7ULL,
+ 0x664a334b5da2e6caULL, 0xf05f1834c6a8a8ccULL, 0x5ca791d846bea417ULL, 0x2a10a0e2e84ad0f6ULL, 0xb805f622cea5bd6ULL, 0xb0749e4c2ac037f2ULL, 0x75ae692e624fc44eULL, 0x4d2f8bd02f13e26aULL,
+ 0x7fa8570463b9386eULL, 0x11437d3db4099b03ULL, 0xf0a8bf16be442243ULL, 0xd7965ffd0a8b4c79ULL, 0x36329380636d8999ULL, 0xdd1afdbdaa77b4f6ULL, 0x7690f24bd151bf6ULL, 0x4f866b413359a5efULL,
+ 0xeeee87d378703a24ULL, 0x4ca29595ac3019d7ULL, 0x4bdbc8e3e9b4a393ULL, 0xa057ff5c00ffd88dULL, 0x5d4af522d011f832ULL, 0x43fd96b47a84bcb2ULL, 0x6ba5856685806046ULL, 0x98db4219171c1296ULL,
+ 0x664651e1fa639733ULL, 0x4574c9fcf8b40254ULL, 0xd90a2ca1699919abULL, 0x5907107abdb9006ULL, 0xedf770c2cbe4bf8bULL, 0x26a88df16628fd59ULL, 0xb882cd684d851ab1ULL, 0xb9d73089d1b11fb0ULL,
+ 0xd0cc42986d2fc8e5ULL, 0x2f404294bd074474ULL, 0x1750ffc856bd19ccULL, 0x159365b5ae95ef0dULL, 0xb58ef30ba90b8412ULL, 0xb795e8b3cbaa659cULL, 0x9d328685ebc67a56ULL, 0xda1d5fd7c61386aULL,
+ 0xc035d406292fb325ULL, 0x66de9578a0a7214ULL, 0x47b4f9202b8fc645ULL, 0x9de80ce6b0b0c81dULL, 0xc3ad2e44911dd128ULL, 0x904042155461038eULL, 0x9313cbd7919a6b5aULL, 0x607ef8cf921e458fULL,
+ 0x4c14515f88ebcf16ULL, 0xeb267031c4841917ULL, 0x9cdef61a02ee929cULL, 0x882a230e4996cb6aULL, 0x14f6d6dc93005d94ULL, 0xadb1d1f5290d32daULL, 0xb7aaaf584433c687ULL, 0xe3991b872e6ac53cULL,
+ 0xf9146cfc17d24834ULL, 0x9d9cd934f6f69ac3ULL, 0x4320474426bdeff9ULL, 0xcdb64facd048be62ULL, 0x4a363ee7b9ace05dULL, 0x2e079ab461415a4cULL, 0xfca596e075917c1cULL, 0xe9784bae78734728ULL,
+ 0x96ce429eaeff14bULL, 0xa972e168c8a7b322ULL, 0xc285c93c923451e8ULL, 0x3590c485b66944aaULL, 0xd7b629f4fc3d4aa2ULL, 0x38574ccedbbab620ULL, 0xb06fbe79b92e3d39ULL, 0xf1b32c61059c1d8ULL,
+ 0x1be78415bf17180eULL, 0xef85f41c501d3cd6ULL, 0x467026412364e1e5ULL, 0x46478d6ab6ba5a2dULL, 0xd83bb3e80c651137ULL, 0x892df4fbe3f06d73ULL, 0x52a8b39b786767d2ULL, 0xd577ae8bbc3e9efaULL,
+ 0x49dc02ccfd64d57cULL, 0x9586c36db5acaf61ULL, 0x109d245f53746a1eULL, 0x4d470330cfb4ed62ULL, 0x63476850932552feULL, 0x30e676109619e657ULL, 0x9926e35641d70512ULL, 0xc8bee52b5d9c43b5ULL,
+ 0xadd59735ff6a229bULL, 0xaef8edeb1e665729ULL, 0x1619e1e992817004ULL, 0x5eb66b9204f573ULL, 0xb9a35769b4d11f6cULL, 0x18ef81002510b482ULL, 0xeeb87b6cc0a7786ULL, 0xba93b4a35674d0dbULL,
+ 0x5a12f40206280a02ULL, 0x96aa4244c7ebc9aULL, 0x32c93e3d30d6b43aULL, 0xc216b2ddf9e72f0cULL, 0x3612e43e03dab723ULL, 0x8abbcbc8220ab512ULL, 0xd263ee4f52c9a6f2ULL, 0xc3905b0e8cffa90eULL,
+ 0x51aea7a91550f5caULL, 0xeede549870947604ULL, 0xccba462c7487dbe9ULL, 0xa302b46831d9d78ULL, 0x119ec69f8d41d4ccULL, 0x91e36fc6dce5682cULL, 0xdc3cc7792e0ee654ULL, 0xf8c13c54e4f90517ULL,
+ 0x78b9dd4f85e33173ULL, 0xb2ea3baa0b31058dULL, 0xaa5396a1834a0e40ULL, 0xa288499d17a1c947ULL, 0xeb93d8aba59145d6ULL, 0x1813c80bf0a3bf62ULL, 0x2e6bf178486a9c3fULL, 0x16cd7c396d3a8b43ULL,
+ 0x71c23d8afe302efbULL, 0x731975d07f1664a9ULL, 0x240aee4f54fdf5a6ULL, 0x16fe9d59b45840a7ULL, 0x5fc6b7bc1aed4487ULL, 0x774d3fb933cedd3dULL, 0xf14802abff0d5142ULL, 0xce5e83e33bf73de8ULL,
+ 0x9cfe2e9c0373f4d1ULL, 0x63565e0c5a7ef969ULL, 0xeb247599126036d7ULL, 0xdcf354461b308d7cULL, 0xb31c8af195e5f6f6ULL, 0xca8a17542b861344ULL, 0x777ee11738e6224cULL, 0xd44fb7a7dba9a8c7ULL,
+ 0x2364fa8f2cc1d335ULL, 0x7cd7c5c36705ffd4ULL, 0xab858a7f007b8503ULL, 0x643a88cd966a61abULL, 0x922c2e2270525a98ULL, 0x350c3bd722ee34e0ULL, 0x279a3d08fd2783d4ULL, 0x51f1fabc39da21adULL,
+ 0xccc01a76ae9cf0adULL, 0xd4b7d6db7c2181a0ULL, 0x6e775acd96781901ULL, 0x3feac335c3433633ULL, 0x9924d29a27fb62f3ULL, 0xb40e8b7a9027b884ULL, 0xd0d525f1c431f2adULL, 0xb461a9cd45557e83ULL,
+ 0x6df5e49a91f6ef75ULL, 0xf4151c1421ba1a31ULL, 0x40d106a9150b64e0ULL, 0xd40c0e04d6e56e9dULL, 0xa0f345e732c3400bULL, 0x4fb64f0a66d01a49ULL, 0x797ca4460de0a33eULL, 0x18c384a1876350d0ULL,
+ 0xb3db43ad760c3379ULL, 0x13d31a78ea1a9a1dULL, 0xea28c97e0f28b6ebULL, 0x2c6d93fd7b8e4ce2ULL, 0x56614cf29aa97c66ULL, 0xffe9dd151aca1953ULL, 0xeed7e15443a914bdULL, 0x7bf2a09a45597ef7ULL,
+ 0xec7b417b02895ee9ULL, 0x8de8e71205272641ULL, 0x8af936637641f0afULL, 0x89c40936f305ae8dULL, 0xf91d8f7ceaef3ddaULL, 0xd7b45be5a5268af0ULL, 0xb71dbc3c4cecadc1ULL, 0xe9ddc69adb214874ULL,
+ 0x760671be96f2bec4ULL, 0x8a6b99ffca182ebdULL, 0x1d1b288fc22467c0ULL, 0x5d5aa95dc70feafeULL, 0x62963fa0c3426b01ULL, 0xaea3146e4a624582ULL, 0xdbd3fbac8b07ac88ULL, 0x9a53967c96152649ULL,
+ 0x32cae4c50818c1eeULL, 0x21db106a68a3f242ULL, 0xec3f70fdbd038aeeULL, 0xe6ce6fa5d9a037e0ULL, 0xfceb07a4f6d503aULL, 0xfe60ce4b22af0362ULL, 0xac41f6882d2e29d4ULL, 0x5646bb8f7a124035ULL,
+ 0x963d407aa4b1e02aULL, 0x615985a9ddcfa8d7ULL, 0x1ee654f7df383992ULL, 0x6e694f3970d50990ULL, 0x257a58f224cd5b9dULL, 0x77527f38168d84fdULL, 0xfd4651db3cce3223ULL, 0xfd61362f3b361bbcULL,
+ 0xf39b499aa75ac3a2ULL, 0x53a5039aab73e847ULL, 0xd20855acbdd86d81ULL, 0x62af10fd01555653ULL, 0x821be7127042b877ULL, 0x22846b63e69a1721ULL, 0x7a2e13acb5b4bf4cULL, 0x31c76d866f2dfb1cULL,
+ 0xe1c5291772f68da8ULL, 0xb5777b875d13891cULL, 0x4bd900db5aabe41ULL, 0x7213a92cf498cef9ULL, 0x4cab2844059deb36ULL, 0xb163739050c4aca8ULL, 0xae3bca8998f71f7aULL, 0xc82fc77461a6cd48ULL,
+ 0xcca16937beed6141ULL, 0x5e29d790474a63f1ULL, 0x1fd9cb6b6968a75cULL, 0xdcfc5c37ddda28deULL, 0x59a319be591833e0ULL, 0x80b62464443d3d81ULL, 0xa275a49ec9ac8a3ULL, 0xe48165102c2c57cULL,
+ 0xb461c2c91974ebb3ULL, 0xae43e32680d82600ULL, 0xbc8e6957dc2be4d7ULL, 0x2c7aec91f5f2efa8ULL, 0x1272f6dda0867131ULL, 0x2b696a7b61e64d48ULL, 0x62b85dae409bad97ULL, 0x88673ef74cc94e9fULL,
+ 0xfe5b61d6a7d75892ULL, 0xc937c00f3be27950ULL, 0x7d363bd4020dfc17ULL, 0xf9c03ba633016116ULL, 0x71e5e67e07955cb6ULL, 0xe7129e0e233ae2ceULL, 0xed04d30301c5bdd7ULL, 0x2bcbaa51d6eebf80ULL,
+ 0xdbce333d0ce9df96ULL, 0x6099a92a3c7732c7ULL, 0xc9b96693620e7ba6ULL, 0xf037af2f7876847aULL, 0xe137a1db913911ecULL, 0x5f66aa33e822c541ULL, 0xbe17f50512f570b1ULL, 0x54669d4befcec638ULL,
+ 0xace24fe8f3fee5b9ULL, 0x93b236048efbd17dULL, 0x55a88a2dc2ba6e58ULL, 0x1d587c5eaf78edadULL, 0xf1c14465abc6d707ULL, 0x9f197b9c2b1550bfULL, 0xeae8f0cc3bfd81caULL, 0x7c7bb32765044bdbULL,
+ 0x2fe3ca91f07bb98aULL, 0xab77d70f6aada290ULL, 0x9ea36562edca03dULL, 0x45f329dcde13f023ULL, 0x403d1368005974c7ULL, 0xefd9d4f45b76d34ULL, 0x119c58c0e2412919ULL, 0x8333d14585546669ULL,
+ 0x839ed561938d421fULL, 0x2d437d273b6f2318ULL, 0x3f08fa946d2e8a62ULL, 0x8f4371db23af5715ULL, 0x5508eb26dd5eba94ULL, 0xfafaec9daf1d9867ULL, 0x8fed235249a9571bULL, 0x2b4cda92605f80eULL,
+ 0xd5100530a12d98faULL, 0x5e061db36cb1c2d3ULL, 0xb1a10c9d13aa4356ULL, 0x788e8fae8c4b94d9ULL, 0xdfed32992dd620adULL, 0x6707a10a48289795ULL, 0xa6eb428671be0e23ULL, 0x9c0865502f5d392cULL,
+ 0x349007b1da3233fdULL, 0x8805f43f187236cbULL, 0xcfe9369080d8efeeULL, 0xca5d390798df4df5ULL, 0x3a73e810e5c3362eULL, 0xb0b91e5c8059dbdULL, 0x148ce837ef921ac3ULL, 0x274f690b9f741969ULL,
+ 0x8e4e5ae9ef97a70aULL, 0x8cfdaadb83d08d11ULL, 0x4a8b6d7da566f931ULL, 0xbc56ce7c2cc9a876ULL, 0xd0f3283b2ab4b9bcULL, 0x4cb103d5cdc6cf2fULL, 0xa1027fbab31b1732ULL, 0xa0f248c2f4290e6cULL,
+ 0x73cc00e12ba9c7ecULL, 0xf6e95b40d1838bf7ULL, 0xbf4b2b33d70f5ec1ULL, 0x5608965859950c0dULL, 0xd6c554317a9400d9ULL, 0xd04d927595268504ULL, 0x7bf40b7c722e6295ULL, 0x66be750ce29b9f7eULL,
+ 0x7a7051afc2f36636ULL, 0x41dc48204e5f2e1aULL, 0xe89a7a8e29580667ULL, 0x95ce3cefc04389d6ULL, 0xb4359f9ccd6ea225ULL, 0x8deafe5bfb7b2336ULL, 0x8e6bc240039baf1bULL, 0x4c2c2613efdecaddULL,
+ 0xcede68a753b012b9ULL, 0x5e98c234451b7bb7ULL, 0x58ebe01d5a7cd5a9ULL, 0xcb955038021c1b54ULL, 0x27f21d5cf1d900afULL, 0x668dbb8e0866b261ULL, 0x7084d4072f364edaULL, 0x4a9b757c93c73b58ULL,
+ 0x78435021afed90faULL, 0x4419400d6740ac6bULL, 0x6cfa751718ff90f6ULL, 0xea1cb71fc73a3adaULL, 0x10dc43d381b81a71ULL, 0x28ab2d5425af552ULL, 0xe8856607b858da15ULL, 0xaaf1c7f8ad21d197ULL,
+ 0x7f599e1bd672d182ULL, 0x45af4e939bad8a39ULL, 0xab215c009c427f74ULL, 0x5e1073a1715165efULL, 0x2b836e0b39996b97ULL, 0xaf94e4ac428d69f0ULL, 0x5169e9a621e2d656ULL, 0xaca31e791742c261ULL,
+ 0xe3cc05665f92a2a0ULL, 0xdcdd656e6270f866ULL, 0xbf5d42653e92239eULL, 0xae3ba6c9f74203d1ULL, 0xa04f0b323730ebafULL, 0xcd182d78e9befb9cULL, 0xb0134b6b6797befaULL, 0x77ef757c83711296ULL,
+ 0xda2b6abfe7da2f77ULL, 0x18d413b96431c325ULL, 0x36736071417d1645ULL, 0x3ea1ddc1ad4a68d8ULL, 0x7cbe1751a9bb70d6ULL, 0x4e60d8f0999e18c6ULL, 0xba93eed4ee8d1beeULL, 0xf32c904e5af2d6ffULL,
+ 0xad92a9d9e32cd3b8ULL, 0x3330648d5dcc675aULL, 0x2dd57b57c52c13c2ULL, 0x7afbca0aafca56afULL, 0x3fc9e113956612d2ULL, 0x652f23728cafa110ULL, 0x906aad0984a7eeb8ULL, 0xb8b649f05cf0ad47ULL,
+ 0xbca302cf1da2c07aULL, 0x603bc3142a9c3db4ULL, 0x85cd805147962a94ULL, 0x69f1a37a0428e0edULL, 0x1e23307c34b7f54fULL, 0x44e87fabc2ca6cdULL, 0x54e71c2eb5c1376dULL, 0x27631590f6be46f3ULL,
+ 0x22cd32b12ffa7abeULL, 0x8178cd33d48576e4ULL, 0xed58e7ac3d50f56bULL, 0x8b2104da9467bb74ULL, 0x612279dddf72b5feULL, 0x7a2f99316397fe6bULL, 0xa09bcf9c9531793ULL, 0x4b2455bc3d029151ULL,
+ 0xe033ce86b6f9b134ULL, 0xf50c3b61a51ccedeULL, 0x2cfb7fb5328bfba7ULL, 0x3ce0ffb849509779ULL, 0x325a5d9f241034d9ULL, 0xdba25998d6dde459ULL, 0xe77e0215decf5cd7ULL, 0x8309856cfff8e0c5ULL,
+ 0x590f9c4f4ff5995dULL, 0xf69a43b6610ce255ULL, 0x7cfa0075644347dbULL, 0x27d6f78354e9326cULL, 0x741b6e03fdea1fa1ULL, 0x4bb8d889f8b74ae1ULL, 0xe939610e60fff5e3ULL, 0x4d8f6246599c5517ULL,
+ 0xc3fd2ad00739c123ULL, 0x7489ac201e99a208ULL, 0x709fd4407cca0733ULL, 0x24de0dc988d02a7eULL, 0xfda3977d67caef3ULL, 0xd34ce6127e9fc7f8ULL, 0x35b55ab541b5880bULL, 0x65f02f42354a8da8ULL,
+ 0x7611d65c4278c2dfULL, 0x7c7fe9591679cb0eULL, 0xaba59ac906c82c7bULL, 0x36a0c47c43ceca63ULL, 0x932e68a4b82205adULL, 0x1c20a82a87cd3c32ULL, 0xe1351b3e60f56c28ULL, 0x528740d21acfcaadULL,
+ 0x17afdca4a82d164eULL, 0x96d0929478f7685fULL, 0x2882456d67767c70ULL, 0xd253eaaa6d6b092aULL, 0xd4df83952814d1e6ULL, 0x4200e0518ddf990eULL, 0xa67fcf84e3118992ULL, 0x7fab7a9ba972b653ULL,
+ 0xd268ea66c8080114ULL, 0x83d908efd84848f4ULL, 0xb9113bfdda81ee93ULL, 0x80896bacd1c78912ULL, 0x855165bd4af284d3ULL, 0x754ea59aac362fffULL, 0xc7424b7e94ad4d7aULL, 0xbd99dffe918bdb9ULL,
+ 0x404c6039dd621fe3ULL, 0x7f66d036ab21c9baULL, 0x928fd2d1de9364cfULL, 0x212c7f835efb9ecdULL, 0x69c61a227171800eULL, 0x854634775a07dee8ULL, 0x5402c6e570869cc6ULL, 0xdb0e971c5f9f84dcULL,
+ 0x6ba9b9f3b7b6759bULL, 0xf27d6361da28aa70ULL, 0x8309cc2b63270c3ULL, 0x6fcd1ab235723b1bULL, 0xed21a510fd9932b5ULL, 0xeba79ca3b229bbd4ULL, 0xf28e951d2f1f13b8ULL, 0x67098dc75963a71eULL,
+ 0x454fd7c8e0f1e46fULL, 0x4da8ca24e38ac713ULL, 0x753fc81bbd039ed5ULL, 0x4761f8ec8387fe39ULL, 0xd54441ad0dd0a34cULL, 0x95cb4fded59c222dULL, 0x2f4dfe213cf89ddcULL, 0x2e76cda4fba2a7f4ULL,
+ 0xdd5eb25787ca0ae6ULL, 0xa02cf62b6c01abe5ULL, 0x55c75fc9433a4fdbULL, 0xe0ddc79f4b9229a1ULL, 0xe6bb91ea930fc4dcULL, 0xbdc16175ae4f1c20ULL, 0xbf3791952882d83dULL, 0xe20efd4eaa46cea3ULL,
+ 0x7987a81e479e0831ULL, 0xb6328a4803e5eabfULL, 0x708bcea81a16461fULL, 0x79106b701ac7691cULL, 0x88dac612a0935dd3ULL, 0x6e97208b5e012c13ULL, 0x3ffe263160c41e3ULL, 0x55f7d6d256033cc3ULL,
+ 0x222fc20f57dbcb74ULL, 0x5c1876bc32010671ULL, 0x66854edbe1025aa0ULL, 0xb66f66e28ea7f13dULL, 0x9195af86e885e88aULL, 0x60f5c574f3cc0dULL, 0xfbac2eb7c1852d3ULL, 0x2afca79389577523ULL,
+ 0xa6adc8c6608b5597ULL, 0xdecc4bd672a8b6beULL, 0x243b7f7a20353488ULL, 0xb6d61f6c2ac12da4ULL, 0x2abbcec0eb72a994ULL, 0x4d744771b621f832ULL, 0x6a9e4997b074dfa6ULL, 0x73865d83b5631be6ULL,
+ 0xeebe530fe6e6eec2ULL, 0xbf4578cb715de2e8ULL, 0x8e02d87646482607ULL, 0xda99bdfefe74db2bULL, 0x7d3c0e7c31a37c7ULL, 0x542e14d3b1fc4283ULL, 0xeae5cca84c8f6cdaULL, 0x209fb288d3f52d57ULL,
+ 0xabe96c8bfc7ef795ULL, 0xa375c0f31edf3969ULL, 0x6907f660ca14dc3fULL, 0x47d9f7970d44da8fULL, 0xbc3cd5b6d290e8a6ULL, 0xbb05e9aefa589c4bULL, 0x33b7ee2df6ea877eULL, 0x829e18d41fabd978ULL,
+ 0xd6753c37f6d07947ULL, 0xce8c90cc180c3e2eULL, 0x6754e3163f86bceULL, 0xb824cc742ec402b0ULL, 0xe76056891fb25dc1ULL, 0xcb7b96e9e34f2233ULL, 0x656d2fbdf69529f5ULL, 0x10c240e41767831dULL,
+ 0xb204957d97938aceULL, 0xc32bcf3ed60b3714ULL, 0xfbdc31ed7ec628c9ULL, 0x65f78fdfd083a21dULL, 0xefe52db81a73652ULL, 0x255e282a748b8192ULL, 0xdda8ffd59ea6327dULL, 0xfc1e540ae7cc6dcULL,
+ 0x26556526caaccde1ULL, 0x7449ff8ed068c63fULL, 0x637fc619448a0ff0ULL, 0x26c2690ad640d0c9ULL, 0xa0043006217039b0ULL, 0x9f4ddd9033ce2686ULL, 0x72bfa77ca5a5c29cULL, 0x74adcda819f87181ULL,
+ 0x8097b167a55c4160ULL, 0x2bd813a516153a50ULL, 0x6fa1cbad7541ade5ULL, 0x51b4e083fe3c1c5cULL, 0xeda07f345ac38f5cULL, 0xffcdb66dce02e66ULL, 0x25d7a070f33d2151ULL, 0xf15d8623b7487c5cULL,
+ 0x22276bf7ecc3855cULL, 0x954919d439fe3044ULL, 0x835c671f93738898ULL, 0x1eb53d13c83599c4ULL, 0xedad0aad5095415aULL, 0xa5763e9a33b6dc08ULL, 0x891c883dfc80ec63ULL, 0x38ac56eeecc12d3eULL,
+ 0xae3464560ba2f511ULL, 0xf5ebcda35d65138eULL, 0x81c76818b0543f30ULL, 0x102bb759b2022daULL, 0xf63ba0a0057c7157ULL, 0x788653b344567a92ULL, 0x99b58f053fbba190ULL, 0xbbff9b65c6d3d7cULL,
+ 0x68e360f9709d2714ULL, 0x749c7312f12c2ecbULL, 0xacbc41c90caba57aULL, 0x3ecba67e0f779ea6ULL, 0x3746f974363af303ULL, 0x149cd2803cee9873ULL, 0x3d1165b86d65468ULL, 0x9f4d5133222a8fa1ULL,
+ 0x2237f6c5c6677ac9ULL, 0x953592ad81d8c39dULL, 0xea7dfe8be5ac19ffULL, 0x94d984be740cb90eULL, 0xaa73a14b0b804d6ULL, 0x98c13770b2bf010bULL, 0x2ad3918681842794ULL, 0x4dc698bd04c0ccdfULL,
+ 0x41dda96fcd48e96eULL, 0xb45dee08a682c024ULL, 0xf24cd49fe106f721ULL, 0xae7d961fb9dc2a50ULL, 0xd1b3b1398d95bd0bULL, 0xbd6a9e502c063c1eULL, 0xd774db3ac9d0b9edULL, 0x61baffff5d369a0eULL,
+ 0xb754da05f8656629ULL, 0x5ff1ca845ea875b5ULL, 0x549307907e4a506bULL, 0x125380cdca3a740dULL, 0x6449fc959879e8a6ULL, 0xab1f0c473ef92263ULL, 0xe4894f9ddd365da5ULL, 0x2c9a0068216c978aULL,
+ 0x645a5f5dbc9a18fcULL, 0xeacbc2fee9e0f512ULL, 0x6b9b5136410906e7ULL, 0x9b223da7a21b447aULL, 0x34e87e069ebfb3caULL, 0x6789f285bfa4376aULL, 0x62c2c7c1fe481bULL, 0x3798c40683da22b5ULL,
+ 0x1bbd740558799493ULL, 0xdf0df5bb45e89648ULL, 0x6152f725f46c0737ULL, 0x31220d4bab95f6e1ULL, 0xb9b973b4a499ff41ULL, 0x802701e8a3ee4e05ULL, 0x3b3979d7e81b4897ULL, 0x8ad509d0f40dd4c5ULL,
+ 0xde3455667cd7ba2fULL, 0xfc8f168bf95b5b67ULL, 0xc9131c8d4ee8da88ULL, 0x35c2c5a25610ad2aULL, 0xea05eb9f0506415aULL, 0x3c4cfaf47c8bf39cULL, 0x1f682ba8870c678cULL, 0x576e9cee4e5c03ddULL,
+ 0xfb9401a993ca05b5ULL, 0xe12617812f80db5dULL, 0xa09f9f14a37a69aaULL, 0x7eb14b37cc7a5862ULL, 0xde87218d12eeb4bdULL, 0x67fb11b408bbc000ULL, 0xd3930044af1cdebaULL, 0x5b83599ef4715446ULL,
+ 0xe5914e9fe0400d7aULL, 0x142d10153da543d2ULL, 0x1d39b8ad62a4900aULL, 0x9a63dab1dfd4fc18ULL, 0xc58b8efe120823d6ULL, 0x44faa75b6254aec4ULL, 0x69a725f8fb2863b9ULL, 0x3b35cb332846dfeeULL,
+ 0xc59bedd73060aa7aULL, 0xfd5af9181299f31ULL, 0x429dc09260f95479ULL, 0x542735252dc573b0ULL, 0x797b487fb7133b2cULL, 0xbd362e01865dc5dULL, 0x3920c6013daefaafULL, 0x276a8692ce430b81ULL,
+ 0x9d8b70f4733d708fULL, 0x8cc7111654c5ce1aULL, 0x781627972eeca598ULL, 0xa9298d26badf5c96ULL, 0xb8df6af9fec50e62ULL, 0x63ec0e4edecaa49bULL, 0xcc2c0fde721cfc70ULL, 0x5db285bdc6a74b93ULL,
+ 0x18fee1567265c802ULL, 0x732ae651ff8a7a3fULL, 0x2cc4e995066748fbULL, 0x8fafe652137dd7b7ULL, 0x72b5024d2e409b75ULL, 0xc2fc438e455007ceULL, 0xeac57ca8d331be09ULL, 0x840f05230c2f7eddULL,
+ 0xda0a70e2be0a2dd3ULL, 0x8a0114f8de94ff73ULL, 0x1813da2bf35e166dULL, 0x1243e4a4811e632eULL, 0xe0e80b5950042255ULL, 0x9854bd9ffeca8180ULL, 0x62529105e4a7e012ULL, 0x247c894e22c56e75ULL,
+ 0x2ec853c9fd1776eeULL, 0xcc9fa34c24a6af12ULL, 0x2d7c6d1faf633832ULL, 0xd648ec3ec70fa51fULL, 0x27513b3b42f53091ULL, 0xf8acebf47da79a33ULL, 0xfb366eaa84c78412ULL, 0xd0e87f8071230574ULL,
+ 0xf6c0f8b08fd2d273ULL, 0xb8a830338da7f7f2ULL, 0xefdc7cc06ee9e4a1ULL, 0xde42070fe64df11dULL, 0x5535afffb43b83f3ULL, 0xa28d49829c8b5ecdULL, 0x6adbf31936daf679ULL, 0xb5b903f1024b0ad3ULL,
+ 0x46085ae51b36d3b0ULL, 0x2b97110ec48569b7ULL, 0x87bb505137a9b414ULL, 0x9670c2c72309896bULL, 0xcecb5f5e22145059ULL, 0x52c6fb75b3859660ULL, 0xea40503e5959600ULL, 0x83756f1cc620e080ULL,
+ 0x3d7b9e9c17fd371ULL, 0x37b369c161a23ffcULL, 0xefcf9a6a2333a648ULL, 0x1011e36c48afb520ULL, 0x6920cfce40c0c130ULL, 0x9d1f765ec0ff1620ULL, 0x428898520411742eULL, 0xa941ab263c1407c1ULL,
+ 0xdb429aa2b9c55ba2ULL, 0x101779d34d99366eULL, 0x35ee21159a3f7115ULL, 0x84ad6711a3ee8488ULL, 0xd7e91576d36d18cdULL, 0x8d870122a0cae92fULL, 0xdd46caab5272a4a3ULL, 0x75fb719f9c7ebcdcULL,
+ 0x8541c960c26541bULL, 0x3467d72eca2279d2ULL, 0x9d4190a7d66ba24eULL, 0x7c3c95adb682615eULL, 0x4cd86482a2e9fba5ULL, 0xbdb0dc98a3790f73ULL, 0xdcf80d6797bb5893ULL, 0xa579cd90b5f3c389ULL,
+ 0x6743719f6714a798ULL, 0x67a2f2a735534958ULL, 0x4cd164885155bde4ULL, 0xe5b222fd9538995aULL, 0x24439556a2e1da44ULL, 0x6a3d2b83aea4a1d7ULL, 0x2e9ac7b7186ffbf8ULL, 0xa4685d47825c16e2ULL,
+ 0xf24f9078582f02e1ULL, 0xcfefa7bfdb749ccULL, 0xa9b21bb6ba25450bULL, 0x79ace07984d697aULL, 0x292fcc78fc6747f1ULL, 0xaaf9c719b7cbefceULL, 0x107b14ccafb63127ULL, 0x58b2ca070f8ee5e0ULL,
+ 0x119fbed15a90112fULL, 0x70418516ca7fbb8bULL, 0x117128021cb7bd0bULL, 0xb5777724b2facdbfULL, 0x8e2ccd0ffcd7a072ULL, 0xf42a44e65548d0c6ULL, 0xab7af62b37308af4ULL, 0x91ccbef7baf44540ULL,
+ 0xf342da4f9c1920a5ULL, 0xfa61c0ac93edbcfcULL, 0x71554d7b86d2467cULL, 0xd1ed1fd9b99e7cc1ULL, 0x977e87c205ba7832ULL, 0xf3fb1b8b17066c0dULL, 0xc6f7610e8160cd89ULL, 0x68d78dcf029f9ac2ULL,
+ 0xd08b8a547243d4dcULL, 0x54258b4fae41312bULL, 0x7ba33cd31d7f9abcULL, 0xac38ad24386f82a3ULL, 0x395aad603baf6903ULL, 0xf83a174b417a1bdULL, 0x527486e8baabf6bcULL, 0xd9b2ebf349841f63ULL,
+ 0x5238e713ea1ebb7dULL, 0xae9ed2f6e2c1ad0cULL, 0x70f12e4257031defULL, 0xdb95e78951694fdeULL, 0x36b8632471453375ULL, 0x401b281fca006b6bULL, 0x96b318a24579f212ULL, 0x6c5445a8e3e4cc9aULL,
+ 0x72e2c86c1bcbfbbdULL, 0x4d74858e314bcac3ULL, 0x5d80d412cab61313ULL, 0xac8bf82634227181ULL, 0x9e549223275749a4ULL, 0xbf1a9fbd608354b4ULL, 0x19209a15ec1cf150ULL, 0xf55da987ee1c4fe7ULL,
+ 0x8a75cc03abc66d84ULL, 0x1f0b0207424c1d67ULL, 0xf16a45526d9adf8fULL, 0xb7091fb873bb89b7ULL, 0x434f1ab4e8098073ULL, 0x68b13b1e7662f51ULL, 0xa27e94bb5eb46889ULL, 0xcb11b7dd76296165ULL,
+ 0x4d614986c098652dULL, 0x5006a5cefb160b65ULL, 0xc36ace0dc6c0d3d7ULL, 0x305e994b980b6977ULL, 0xf71256459caa6662ULL, 0x811f74a4fc05d6a5ULL, 0x7da2f34f28620d8ULL, 0x23a3740cb0366441ULL,
+ 0x7f7548287a9f2241ULL, 0x752308e980fa1726ULL, 0x28391fd2e5159cc5ULL, 0x5e4bdc2363a51fd6ULL, 0xbc7f88153ef3d852ULL, 0x5f1b5ad9e026090fULL, 0xb2c56de7c73a0942ULL, 0xb24ebb4e7ddd61ebULL,
+ 0x11d516da6fe68878ULL, 0xb89323950f7c5afdULL, 0x7de3a76f5781ef4cULL, 0xa0085c88c345fe38ULL, 0x3335624a8d648ad8ULL, 0x93339ea06eea9df5ULL, 0x2b1082c2978d7286ULL, 0x46e1d020f239eb07ULL,
+ 0xcd9b3e975d92d07eULL, 0x389d1e45357998e4ULL, 0xb80d8e929502bd30ULL, 0x528b11d25d05c97cULL, 0x99cfcd1ed3250751ULL, 0x6f304821fe9e5f6cULL, 0x6aa1f9f7ee99e259ULL, 0x4cc0d5177f189484ULL,
+ 0xa7f6ae8120e09c30ULL, 0xc465d02bbd5b7c1fULL, 0x2d13b5451eaac7b8ULL, 0x44de46152deec5eULL, 0x17a35bfa0c926b5aULL, 0x7d4647f2fb0cee2cULL, 0xb9a6a6b5601c4b26ULL, 0x4c8bb442bc6b8be8ULL,
+ 0x1cc5d5c8af778feeULL, 0x70b814f8e803b76ULL, 0x4463da5db74cce80ULL, 0x2144b2e8cd5b3a6aULL, 0x1a2a4a3db9c6be05ULL, 0x2af379c79a172ebfULL, 0x1ef858dbfc226d6eULL, 0x69a4e201fa86a6d2ULL,
+ 0xf67d007bbe488a9bULL, 0x3ef55dd120a3742bULL, 0x553c7f67d48eb943ULL, 0x9717432f2bf9709aULL, 0xfba3d8ecf7d3ab49ULL, 0x88d19f43089ef09ULL, 0x11d1941cd011fc73ULL, 0x9056e6eb8eb99552ULL,
+ 0xeb248deef10bda5bULL, 0x247d2c41e3ff0c5ULL, 0xac1783c5af6aeddULL, 0xea8d6052c4aa0619ULL, 0xeb981710b5f28100ULL, 0x2ece6829380dc44eULL, 0x405f3da1e54afbbfULL, 0x4b4a916b4e5f47fbULL,
+ 0x51969ba8be98559aULL, 0x23c0dae2f1bf563bULL, 0x47a7973fe35326bcULL, 0xcf8c62d210386e66ULL, 0x49ec3a99522c2ecaULL, 0x154ade3d3fc47a69ULL, 0xa60c8b5614553505ULL, 0xe5aaa5d61bf25a66ULL,
+ 0x9164b2e003e78560ULL, 0xd5f9206aa3dcbf93ULL, 0xedc9f24d04e14054ULL, 0xb81955dad36fbacULL, 0x4664c86f8a8a461bULL, 0x7743af38880169e0ULL, 0x462c76f583d8d3fULL, 0xd396d764b9b3e55ULL,
+ 0xce6e442a47556139ULL, 0xa817e85a39915985ULL, 0x13c2a4b41a7384e5ULL, 0xa79a741dda6ca730ULL, 0x68f843e03b839e49ULL, 0x3272797be2f87352ULL, 0x13da6ebcb861bbefULL, 0x8390d0445153ca0ULL,
+ 0x3c8df2b98548e387ULL, 0x997af813cfaa5cfeULL, 0xb5ca5fd7c116af70ULL, 0x6a6f8bd8157372e2ULL, 0x28d58d87172daa2eULL, 0xcbbd869549902cfULL, 0x26b0e8a761a113ebULL, 0x6139d0a8d979eeULL,
+ 0x569a65b73189cf01ULL, 0xd0a3e788f35463caULL, 0x6d2d2a4ed7efd801ULL, 0xcb473b24b17b5dc4ULL, 0x1638289e97b4633fULL, 0xf08415c75267b7d3ULL, 0xbfbba539f4b36e10ULL, 0xe8609655080a8559ULL,
+ 0x4aebee51c2d4ede1ULL, 0xaf13de5a6a494f2fULL, 0xff62d37829b1a9ffULL, 0x7848dc1d0f9010faULL, 0xac2a11770302b003ULL, 0xc4bf65cf11571a5dULL, 0xdb8b590919914b7dULL, 0x548a22a34b6248bfULL,
+ 0xb479845dc16ff0ceULL, 0x60ab539a97eca628ULL, 0xe030b931a671bfd1ULL, 0xd4c976c57b94bfd7ULL, 0x96b37d220f5af4dcULL, 0xf8b269e223c2a67dULL, 0x48621be95f547f18ULL, 0x54d0847ac6bb5cbbULL,
+ 0x6bd8425317ded5d4ULL, 0x341b896f9550ec0cULL, 0x2564ee825ad3be3eULL, 0x1aba115117bfdbfdULL, 0xdaf1d3261197e74bULL, 0x96c49323d37cfae4ULL, 0x1478c332d52c0190ULL, 0x7512fe14db7e9fc0ULL,
+ 0x5eaa909750d9d009ULL, 0x5d7f0e8489c3af89ULL, 0x4ae24286157e3c24ULL, 0x1133a3da7092c79dULL, 0x1b1fa218b8b994bULL, 0x87db25c7ddedef1eULL, 0x1f766e9801207604ULL, 0x1e5f75767665ac4aULL,
+ 0xb9e1d33bc32896f5ULL, 0x3d388bcb737e7a4dULL, 0x561776a11c35da13ULL, 0xaa12e0d9fbb4fc4cULL, 0x1f6f61ff28848c10ULL, 0xdf5c5c6ad3a6839dULL, 0x8db1339da6c2622ULL, 0xca49c62e0699997ULL,
+ 0x58cf06a4c2ee89c9ULL, 0xd225e0a45d35626fULL, 0xc9f43b69d66b5d85ULL, 0x14ea28c8fc055883ULL, 0x860689fdccd3e8baULL, 0x29baff3fe1ce22b9ULL, 0xc4e068c6cdc92397ULL, 0x40a0c6fdea00ec72ULL,
+ 0x9cff765b27500f7fULL, 0x3e8e1783438ec076ULL, 0x7c6f7effb5db25f8ULL, 0x770b4d9bfdf81b75ULL, 0x523784bced40bd21ULL, 0x4df275e7b0ddd560ULL, 0x2295652efd42b16ULL, 0x8983358fed30c5b6ULL,
+ 0x39333d720b8a6196ULL, 0x67e08c6ca5e25bbcULL, 0xf77655a62cb97ebcULL, 0x659d2ccdd8c98995ULL, 0x7afccb5bca6340a4ULL, 0xf4c09ea91cf1d904ULL, 0x4a1599c7ffb602f6ULL, 0xb9ffc14b6c90eb9dULL,
+ 0x45578fb1efbd690fULL, 0xd3db64bd44fb970aULL, 0x38313b9f15276d39ULL, 0x2541b1db1a91be4ULL, 0x44f119d0a6e6150fULL, 0xffcab51b5c47d459ULL, 0x44649d9e28f6c062ULL, 0x3af5fbd472ae9f6eULL,
+ 0x17573fc2b3db454fULL, 0x622a81e8fdb681b8ULL, 0x4dbf54932ffaa880ULL, 0xa9189c16807f0d3bULL, 0x4cf9e7eb74ba70a9ULL, 0xc7aab1c2daadd769ULL, 0x412f417b8e2308e9ULL, 0xcdb1d51c267c8492ULL,
+ 0xed04f9ab0161ff97ULL, 0x97d81b0125df746eULL, 0x4936a17c19c3f32ULL, 0x73d9a6c8bb908180ULL, 0xbd3b1dcf6099162bULL, 0x27e6b144d0dde2adULL, 0xabcdd870f61180aULL, 0x3c3e734fc626fa7ULL,
+ 0x5968813bde54a531ULL, 0x4b5c5d3f2969be00ULL, 0x1a65807971efc760ULL, 0xa8602bfe17c7320fULL, 0x5b2a2e11b446d34cULL, 0x88e16573e3abefb0ULL, 0x7f708065b782a3caULL, 0xf2bb73a305a75be5ULL,
+ 0x1433c24a392877f6ULL, 0x6d65b4225f8f62b2ULL, 0x8cd1e46f8ffbd878ULL, 0x8c35a6d93490304aULL, 0xe5c87e11748b55f4ULL, 0xab80e73387e3439dULL, 0x349b8d2bd29e71f4ULL, 0x4644080c7adda4a6ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x4fd1a980ae5c1b1dULL, 0x30caa5afcb63a9fULL, 0x410ee06214ced05dULL, 0x963d58940db65b5cULL, 0x9b1a8630b15ac0ebULL, 0x9b1c639f539fca8aULL, 0x8f90de0e49a7cfc5ULL, 0x193517beb2b9c8efULL,
+ 0x2065d669f21a228bULL, 0x3d20e930f11fcf03ULL, 0x1843948ff1f44037ULL, 0x953f04e8727fdd47ULL, 0x84099c2210d5d709ULL, 0x58cf3766b816fa0bULL, 0x6e60b4d341fcca43ULL, 0x4d4e488111eb813eULL,
+ 0xd54b1e747b4d35bcULL, 0x9a7dcaea5518e30ULL, 0x99a1756eee48fa2cULL, 0xd44c94c8198fcb34ULL, 0xf6c16d6f630fd7d8ULL, 0x3be919228b4318fdULL, 0x163a6df4855b3f67ULL, 0x12e79bc434eec220ULL,
+ 0x832d9bcb27c5c85aULL, 0x1848e53310e94158ULL, 0xcb1553197b51b360ULL, 0x1ddf01a698d035e2ULL, 0x18fd0fcb9bb38e22ULL, 0x28f9a68890e5bb39ULL, 0xfff420c5348d5b77ULL, 0x4e118dcdb05d28b0ULL,
+ 0x25686912f3b88272ULL, 0x3f5b60b9e81752a1ULL, 0x8c67cf97db959d07ULL, 0x9c7970ce33964ea5ULL, 0x52619bcc77cccf1dULL, 0xf231a51cc3d73359ULL, 0x42ca6bc94948e083ULL, 0x9852e556e0ca151aULL,
+ 0x5efd6bb9fb6fe930ULL, 0x4924bcb52cc06608ULL, 0x27fa956c1999e283ULL, 0x9b4d42fa748433e7ULL, 0x31215a60995e2551ULL, 0x169744116a330babULL, 0x30830d0b6ea58f08ULL, 0x64106fac235a3da9ULL,
+ 0x2de46377d0e68013ULL, 0x40a8d196fbc1753dULL, 0x54f517d924ef8d38ULL, 0x2b172ac9ed4289e8ULL, 0x72e7b9d7f81c288aULL, 0xf00c8bc9e3fbd481ULL, 0x33e091ee08abdec0ULL, 0x14cce6eb7e3d7c41ULL,
+ 0x42fe3ede9053176ULL, 0x7634dafa54c0782dULL, 0x7a09f1cb03374fb7ULL, 0xe3b0370387925c97ULL, 0x1351f200e35accb9ULL, 0x85e35d1712ec5969ULL, 0x1a47baf53d165701ULL, 0xba6cae1f27f10188ULL,
+ 0xd88321daead273f5ULL, 0x872e3d4af4b167c6ULL, 0x15e80bc01bad5c44ULL, 0xcc7643308a4ce9ddULL, 0xe78ee7ee9804ca9aULL, 0x5e62f75fc4955740ULL, 0xdc1be7fcce958fc3ULL, 0x40fdada68ee8e994ULL,
+ 0x3d1e192a2c486457ULL, 0x5e150b4ee3e54c87ULL, 0xcc2d78e51e3ed62ULL, 0xe5c4e4eacb9e0963ULL, 0x12550aa2e86457f5ULL, 0x641a4d21783c8229ULL, 0x2c8a9f31f0948bfaULL, 0xcdbcee02c9878755ULL,
+ 0x2978ae49914d2a99ULL, 0xea4e832337281224ULL, 0x1792a8cbc121737cULL, 0x4e110fe6828ab278ULL, 0xe34a88249854983ULL, 0x57ac53375eb7eae2ULL, 0xe2d59a3c4f2cfe8eULL, 0x7e0da884711fe2feULL,
+ 0xa9df81cd9d3bca14ULL, 0x610f6148d7921260ULL, 0xb8074d5e70ba963aULL, 0x9e589812cc400cdcULL, 0x5c846162fef40cefULL, 0xe3973030cb50360ULL, 0xece20b98018544a3ULL, 0x29a6c69bdfba582cULL,
+ 0x258ccf5c98e212d3ULL, 0xfae303c9d98dbadULL, 0x174537ff40b4070eULL, 0x9195811cefb22fbdULL, 0x641c64859f04a9ebULL, 0x26a5f72dc917a0eULL, 0x46bd2daf868fb45dULL, 0x759b12bfddd53efULL,
+ 0xf722cf133ee82013ULL, 0xc85a44804dab59baULL, 0x8f6cc54c3246868cULL, 0xd01ee5e194ccb3b6ULL, 0x96165a696b858daULL, 0xa242f2782f9e747bULL, 0xdf561bfa936ab2ULL, 0xadc1f71c53e1880cULL,
+ 0xa21d33651052ad86ULL, 0xd5f9395e3ef778eeULL, 0xf5f092754b024970ULL, 0x6e307f154cba245dULL, 0xe700b1118ff042d7ULL, 0x7930ac6914183742ULL, 0x1af41005064747ccULL, 0x896c69250bcaf971ULL,
+ 0xe5428e77d81974feULL, 0x5db31e9dc8887f61ULL, 0x1b857f0e42f021d8ULL, 0xeef05da7b8c68603ULL, 0x13ded47eefb64e63ULL, 0xa751ae21839828d1ULL, 0x67cc915bdef2f2e0ULL, 0x43fa11c10d7cf387ULL,
+ 0xd235117560b1c021ULL, 0x2e10dd4e1eb3a5fbULL, 0xbd5045458216f76bULL, 0x6179bea94a10ccb1ULL, 0xb01c3b59962fbee5ULL, 0xb9122d1637a9af49ULL, 0x4406d8b639e02565ULL, 0xe2b941dadaa6c801ULL,
+ 0x347a0dbbac7f213aULL, 0x4ad45d2b502ccb92ULL, 0xb2f786414467e6aaULL, 0x85c9d828191bea44ULL, 0xba3a9f1f7810ee12ULL, 0x703397d8ea1b3803ULL, 0x107940e315200896ULL, 0x46872b9e5771df5fULL,
+ 0xdd05e36292656a30ULL, 0xd5177883e47c23bdULL, 0x456905c76b0bde75ULL, 0x3d6c7647f81f8d45ULL, 0x2a56fc6c3aa3a1daULL, 0x224d99354531c627ULL, 0xda30bd7a0b2d2117ULL, 0xf2197ceec7032f33ULL,
+ 0x18be78cf1fc4172eULL, 0xa7f005b0d3de8a38ULL, 0x9c5d0bb27c03611dULL, 0x7cda2b9d62e53e81ULL, 0xda7859e2d0e2d8e2ULL, 0xe1d91c3f6256c1cULL, 0xcbe3a47476149ce0ULL, 0x78bc493a25018fe0ULL,
+ 0xe7d132051ad190b0ULL, 0x706494293136321dULL, 0x118986cd7d6d5defULL, 0x55451cb68d4f5e4dULL, 0x45aa724d2325a5e4ULL, 0x66a373f7e86e0affULL, 0x85104968f4c8262aULL, 0xa06992553c9b5611ULL,
+ 0xa7a638a235c36f45ULL, 0x7d20429067e4c070ULL, 0x1284743e95f15f70ULL, 0xe7dc22116ae44866ULL, 0xc0e7eb7846a487f3ULL, 0xf396258dcfe363fcULL, 0x194824b7d04bef2dULL, 0xc8f8bdf0b5d4c711ULL,
+ 0x5fc881c794587b6ULL, 0x1b885be8a870ecdeULL, 0xd03b460e6ef7eab4ULL, 0x19fe6c1c7c1c124ULL, 0x8b6adcb6f5ebe375ULL, 0x719c55c018985cecULL, 0x6d7bd32ed2925b2aULL, 0x380688b5d2427a04ULL,
+ 0x6413a9b04fc27240ULL, 0x13527b57c687b625ULL, 0x6de826cf90665260ULL, 0x4f60f3e66e84af2eULL, 0xaa091f8eded888f8ULL, 0xad5b8676086eefe5ULL, 0x1fa91bb121320520ULL, 0xfb675ab6a5478c7bULL,
+ 0xfece844f93d28edcULL, 0xc0dc2cf1e7baea9ULL, 0xd91c26d635102089ULL, 0xdeb5b694a4a2bacbULL, 0x9eeb33c554fd5631ULL, 0x8ffd7413065668e1ULL, 0x946679dd29589001ULL, 0xbe39361db2d666ceULL,
+ 0xd899aacc24ef23edULL, 0x21d8af12c19061a6ULL, 0x5bdae58835fd0365ULL, 0x75ab8aca66d6c04bULL, 0x85da44fe0322447aULL, 0xc544427ba38baa45ULL, 0x3cce1ab8778c182aULL, 0x61494ce440c5ba78ULL,
+ 0x9179e6b350d9775cULL, 0xf8b1275f133f9a7dULL, 0xacaaf5f418c8dec3ULL, 0xdcf37e49843020bdULL, 0xefde2e416523ef84ULL, 0x91938eb29d6a88a5ULL, 0xc41d13514ac0c217ULL, 0xaa6c2b7f70459993ULL,
+ 0x6f0cfc4b69387273ULL, 0xe0d57adae8502134ULL, 0xd9c86854e41213bdULL, 0xa4708e24bed405cfULL, 0x48eaa13fef3d2e21ULL, 0x172da332b37818d5ULL, 0x2e3ff5c82f2cce2eULL, 0x61014330ffcdaf11ULL,
+ 0xc6a2315c2a0f05f5ULL, 0xcbe599ccd93ea8ULL, 0x920c7dbf83e4b64eULL, 0x8663720902ad5fafULL, 0xb01a0b108775fed0ULL, 0x73521ed6b942408aULL, 0x443087d8ce0a0cbfULL, 0x444e0556604d7289ULL,
+ 0x7bb0161cb0a7d767ULL, 0x99ddf87ec76e0237ULL, 0x782e15a3fb32e998ULL, 0x74b3a6cafb89da13ULL, 0x4505f2aa161bc34ULL, 0x4fbd17ab622b18bdULL, 0xa6db128755058102ULL, 0x1ea01419c50cb724ULL,
+ 0x24cb77a6c9af0a20ULL, 0xfbda7782d066e94bULL, 0xe666d93e00504672ULL, 0xec89a356f62db71eULL, 0x885b2fb831c6b63cULL, 0xcefd6ffb80cfc6cdULL, 0xb10a2ef090b1dcbdULL, 0x85a8789b64b23768ULL,
+ 0x68272bd5ee47b64bULL, 0x5498ab6eabb1d60ULL, 0x6fc9ce271e1f2ec4ULL, 0xdf8bb706902ab905ULL, 0x5ba64ead0f6b3770ULL, 0xa6975f3f0b96e3b8ULL, 0x355b42e0d306b644ULL, 0xced4bd21337192feULL,
+ 0x70729d1110e19787ULL, 0xef68333a6b593c6bULL, 0x1d44be374f0f5ed6ULL, 0x537236412aa3fa2bULL, 0x33fab153dbb6055bULL, 0xaebf359780aae46aULL, 0xe3655e70a70e4105ULL, 0xc1547c33198da9f5ULL,
+ 0xa221f1760c11c521ULL, 0x3f29d365ff361568ULL, 0x9dd1ba65a6b89e92ULL, 0x68bf3b0f657ec0d3ULL, 0xd5305553f8c77f81ULL, 0xf88daf9390e6973eULL, 0xd7baa83bf083971ULL, 0xe40bbc5d7bd90de5ULL,
+ 0x4622ac08ef73b31fULL, 0x4abaced45026666cULL, 0x8f5db7004dc3d7fdULL, 0x3d4a827a863d4abdULL, 0xe1d5aa434d7f0b5bULL, 0x8d73c65e350806acULL, 0x60102518a3df2605ULL, 0x27f5c207392d026aULL,
+ 0xf320363ba7fe4ebdULL, 0x391167f27d88eea5ULL, 0xac246b4c06f19cffULL, 0x3d13320e47f71be0ULL, 0x6894d35868d313f5ULL, 0xba9176f8a18a28f7ULL, 0xb56afc5cb1499493ULL, 0x1b0c009e35f92bc5ULL,
+ 0x295dfc7aa66936d0ULL, 0x9c39882915ca2293ULL, 0x6f348fd0a66f62fcULL, 0xc52a71fb578ab499ULL, 0x1d518b58881c088fULL, 0xcacc201d4a5e827dULL, 0x75e9c3de54d343baULL, 0xda26ac8d8939f614ULL,
+ 0xf38b25d00bf6090dULL, 0x238f61ffc0bece98ULL, 0xc0cf8e608e8f5a07ULL, 0xf5d07ce83d7de0efULL, 0x9db6c787372673d8ULL, 0xa731024cc015e3f8ULL, 0x62e85aec7037b5c4ULL, 0x8093a439761a69ULL,
+ 0xcc21316b1554f5f3ULL, 0xa9238a6cca25b33ULL, 0x65da77b5d52018a7ULL, 0x68b8396bf0791ba6ULL, 0xc60a1d2807277fbfULL, 0x89c085d19bcd007fULL, 0x52bad43c90eae401ULL, 0x57ea14116b061837ULL,
+ 0x1522b0dfd22810c3ULL, 0xa2cff1c0f1dd9d98ULL, 0x58c3880422d01631ULL, 0x2353061595cdb229ULL, 0x60a08e34248e3be4ULL, 0x4ec8ab387ab5114bULL, 0xbedca11bc1e49bc5ULL, 0x5ef3b49a6dbf7d58ULL,
+ 0x32347d6f6af30cf5ULL, 0x71edf0e167a59ed3ULL, 0x907708586aad84b1ULL, 0x7e23f8ff61aeb014ULL, 0x1c5b6c3ca031ed91ULL, 0x4ddad93c7da66137ULL, 0x9376fac9d18bbe29ULL, 0xc8ec4f90d8f6235aULL,
+ 0x323a5c576ed64ea5ULL, 0x511f205dfcf924afULL, 0xa4d79d9bae530cfcULL, 0xe78119b8c80edc04ULL, 0xbe7c3955db1182eeULL, 0xbeacd4771f718b00ULL, 0x13a4577b7e5fa1cdULL, 0x5241dfe621c1a8aaULL,
+ 0x4f68efefd3cdd8deULL, 0x8d33af8d91d65ee7ULL, 0x5e4dbf702b13b0e3ULL, 0xd5bf88c0a1859ee4ULL, 0x287733d571f42233ULL, 0x3832769e7e89a98fULL, 0x3910d2e32ba79704ULL, 0x742bdf1443d9193eULL,
+ 0xb96cb1f656346056ULL, 0x26be10df7fae7295ULL, 0x72171af522d768e1ULL, 0x38ea1455aed78dd8ULL, 0x481b53ac9e74127fULL, 0x43cdbe514cbfcda3ULL, 0xa3e405d976b5473dULL, 0x6499b0a8473d060cULL,
+ 0xa142561757d0c104ULL, 0xbb1482d22e1c8655ULL, 0x189eb552f2985637ULL, 0xeb21280cf8b95331ULL, 0xbd2715a50b665394ULL, 0xf73ac57082cd01dcULL, 0x2f843a9d74ac6312ULL, 0x192d3f180559ec9aULL,
+ 0x5b50dd72f7c32d5dULL, 0xf506655e9ac1ad1ULL, 0x2e1757eeab354574ULL, 0xd7c37c2ceb048edaULL, 0x831cb8d1d700d53fULL, 0x5a36dbb7ee17bd42ULL, 0x3a25ea1c6784ee79ULL, 0xcc155fb00a1a6527ULL,
+ 0x43d0e44e3c04b6dULL, 0xe71b2c14348052d1ULL, 0x11c0b41d4a454658ULL, 0xba10e7124568c18fULL, 0xb65aa1f2b516b9eeULL, 0xd36a0d58034c1722ULL, 0x4b1e76f1fae8083ULL, 0x556600e98c5ac32fULL,
+ 0x2385c29406c91eaULL, 0x8d1be994f8f83df3ULL, 0xb611d5c73af81a8ULL, 0x104e78b70521b69bULL, 0xeb6c68f58f786742ULL, 0x8289c4562d292468ULL, 0x85068f08ad5889c6ULL, 0xc96333215dc3c492ULL,
+ 0xaf26a947e5da05d5ULL, 0x86a613f9079ea1cbULL, 0x3c45c2730bd82901ULL, 0x5b056cc7ee6bace3ULL, 0x1699f504a4783912ULL, 0xe069ea8d44adc5f4ULL, 0x3fc555afb87056abULL, 0x65ab3b1de1572f02ULL,
+ 0x32c7f36c1338a1eeULL, 0xb35f31168027665fULL, 0x17fe433e497f9604ULL, 0x8cbfda6491cf4989ULL, 0x441637f1ada8df2eULL, 0x4ddce237aceb9bb3ULL, 0x30d13538dbcd1c4dULL, 0xa9055bd8317dc19fULL,
+ 0xca6f09282b05d6e1ULL, 0x562dc1688ee772a2ULL, 0x39bb95454c7ed5a7ULL, 0x9d383542063e586bULL, 0xa0182a5c648203e9ULL, 0xa2ec545279331d85ULL, 0xac0be273fbcd0680ULL, 0x6dd077a8087678e1ULL,
+ 0x77e31a63e2674740ULL, 0x525914ad7d2d8542ULL, 0x929975c375da67a3ULL, 0xf7041870efaf6737ULL, 0xff7704192aba3eb9ULL, 0x2c09ba21c88df89cULL, 0xfef127f50cc064b4ULL, 0x648eb55bd428d481ULL,
+ 0xf4855266a7981be6ULL, 0xc1e84f6e85afda3fULL, 0x68251db7d618542bULL, 0x5aef78d147dec31dULL, 0x394b92cfd7ebedbULL, 0x2cb24bfd5884d41bULL, 0xd2c9abcd49eff22eULL, 0xe3dbd661022bd081ULL,
+ 0xc989730dbf5de954ULL, 0x7e7011b1ae77267eULL, 0xaadc9a07b83a221fULL, 0x6cd0679aed4f86dULL, 0xa6772e1fa041c5c1ULL, 0xa16b443c0ca7551ULL, 0x44f4cf0736b9537ULL, 0x922994dbc54c1c15ULL,
+ 0xc9b740f6e2a88f1aULL, 0x3d993ea101063525ULL, 0x385df5e908c847aaULL, 0xf81f1bff3f718395ULL, 0x43d3e1dc94cefda8ULL, 0x8d42f456011325c7ULL, 0xf71fafa3cbd3e93fULL, 0x90dd43ef96156605ULL,
+ 0x2d8723a003302ed4ULL, 0x7aab2f6383b4a143ULL, 0xa3c3b3773c01d04aULL, 0x1daae350d63ec6caULL, 0xbe790b2f11408e15ULL, 0x67ac1a783aac594cULL, 0x71a7a9582f801c0dULL, 0x29b5e06acef1a325ULL,
+ 0xcf1b65f9b267365cULL, 0xd0c80fd68fff3cf6ULL, 0x7a31ed66632be4f0ULL, 0xa37cefa2167a715fULL, 0x1e206930c3f5c4a4ULL, 0x9f34db876207853cULL, 0x352d52fc3ad97f8ULL, 0xf944889203cd64f2ULL,
+ 0xc15298fb0170e2b4ULL, 0xef0565710cdd0788ULL, 0x9951499201dbbf9cULL, 0xdc1fd831713005c1ULL, 0x9022c8e18c9294dbULL, 0x37b306514f2a1bbdULL, 0x3ce0a33e47340c33ULL, 0xcc69d28dc46c0767ULL,
+ 0x86dada2f912e9cd0ULL, 0x74d674ad798efa41ULL, 0x6ee731b16421253eULL, 0x6b20f00f57c10ac1ULL, 0x1787667b4ee6c468ULL, 0xeef6f23a2e298fa6ULL, 0x948330a00edc129ULL, 0x42c77b9afa9ba327ULL,
+ 0xf2b704e548bc9a64ULL, 0xb9003f3cb69581a7ULL, 0x3f8725be3867c148ULL, 0x6a7ad4d8db44d8c5ULL, 0x1931ecf0da7023e8ULL, 0x646bb448e6e84ea5ULL, 0xf13019e971756f4bULL, 0xb9ce095d2f4d26cdULL,
+ 0x1da28ed0ebcbf3feULL, 0x162077f7df573583ULL, 0x73ace55546b96d84ULL, 0x7ea66628ce80821bULL, 0x6280076bbe6271b7ULL, 0x833ac087179ed4a3ULL, 0xc681f79b5a1d1325ULL, 0x5bac73b5e0f4c8cULL,
+ 0x9f6a1c4210b56425ULL, 0xa41fd086c9c3e331ULL, 0xb606e8771849acbfULL, 0xfd47da8385e33518ULL, 0x11c8a05750663cf0ULL, 0xd7e988c3f926b382ULL, 0x526a6daef0b94037ULL, 0x4dcc7d6813f772ddULL,
+ 0xd89883891d6d1e7bULL, 0x8837454dc071c703ULL, 0xb64d32c2609ffd91ULL, 0x54719b1b1d104f4aULL, 0xb9f2ac0946ad5cceULL, 0xafa29370813cd677ULL, 0x649b8625de7fb94eULL, 0x286efd9ec5f19a70ULL,
+ 0x1911c573f8a4bfa1ULL, 0x2e62c5f8fd48ea3aULL, 0x6b0cfb912441688dULL, 0x9a12b8393834a07bULL, 0xc0e52fe7407619f3ULL, 0x3b496c76202c3cb7ULL, 0x990afc841ed7fccbULL, 0x3a80c96e6eaeac06ULL,
+ 0x6b2f3bf78ef56ac6ULL, 0xd09032eecb2a1c47ULL, 0xbfae01ce434eee89ULL, 0x476dc85cf9b7beb6ULL, 0x420fe1b2de063b26ULL, 0xbe7f807a2b518f5cULL, 0x2b4c391d66902421ULL, 0xef4f7fe6a20538abULL,
+ 0xb88f3dac269d5f4cULL, 0x891a4925d7fbc3cfULL, 0x600feee98aa72c0bULL, 0x753de9a4d56a11b7ULL, 0xb191ea09ca8e17cfULL, 0x8d0dc4d6893c6a66ULL, 0x4dcb9adfd03ee874ULL, 0x935a6319ed3761ffULL,
+ 0x24c7d22f4ac26c86ULL, 0xc93a6a24ccd63adcULL, 0x9f16a65ac0263b88ULL, 0x5bc447845c97394eULL, 0x7833c2819135c3cbULL, 0x22afce187e4dc371ULL, 0xffb225946190d8cdULL, 0x6d88b6700ee65030ULL,
+ 0xe17b44dfd988505cULL, 0xc91719a44d1efd59ULL, 0x460ef367afb16c26ULL, 0x5234993f7f2d7931ULL, 0xca6628517d3a104ULL, 0xee570f674297df4eULL, 0x7391238c1e66923dULL, 0x277bb41d637404abULL,
+ 0x3c998202b71ba5c8ULL, 0x13e529373fe56989ULL, 0xa0aa7daf6a96b35aULL, 0xb28a1c32b77971c8ULL, 0xd2e2e6f0d938ae13ULL, 0x778496b9a6104ebULL, 0x6de6e21fbcc421e8ULL, 0x84da6ba47701f8faULL,
+ 0x82c4070f1b380a1ULL, 0x318763bcb1907bccULL, 0x7b30d3d7e85ab7a8ULL, 0xe1d8dfe05852e0f2ULL, 0x3f99ccd9d05154dfULL, 0xc343dbc75a0bf895ULL, 0x219497aa9fc0a367ULL, 0x4e94fb0e240cce1ULL,
+ 0x8a76b1eb51fc714fULL, 0xd939fd974571ab1dULL, 0xcb401fb4e4cb9a53ULL, 0x92180da3db82f94eULL, 0x9edc365d2ec9d29bULL, 0x25879375c8db8ed9ULL, 0xa2da75282e8284fdULL, 0xcdc55f8cac9f525eULL,
+ 0xa3f2b3b22d429589ULL, 0x20cdbed846c5610ULL, 0xcbb149af3b5604dULL, 0x3b2ead9c4f178a42ULL, 0x6647f3295133b55fULL, 0x8f9d711847814c65ULL, 0xbb5a395bf1fc399bULL, 0x2c9ba27cffcaa00ULL,
+ 0x73c4a7d3a85896d9ULL, 0x4b16daa8e93382c6ULL, 0xf03de5b1555f85b7ULL, 0xb58d6c5a1b2ed31fULL, 0x4a20cc962e730b1cULL, 0x5dacf6af983829e8ULL, 0x2d6de765b401199aULL, 0xfbf352f176d1bd75ULL,
+ 0xbc564aa8b10470f3ULL, 0x9630f290d9073c8fULL, 0x1b8890394012e677ULL, 0xbe066f1810b15d0fULL, 0x2c64274f904b4dd4ULL, 0x320525852ba42e9ULL, 0x8fadd1ec7b08eb95ULL, 0x289a8ef45b620cf7ULL,
+ 0xebc65a4b1871ae62ULL, 0x203d34003e2741a7ULL, 0xa37093260b4f76efULL, 0x3802bbd0da975a67ULL, 0xb363ec401fb43666ULL, 0xbbadc1a611bbed57ULL, 0x6f343c2a722e230fULL, 0x1ceb6ddbfe784270ULL,
+ 0xe64c49e5c414651aULL, 0x960d84f9511c86d7ULL, 0xb866c30e262cded6ULL, 0x16535b2ce431780fULL, 0x673b6581b902e91cULL, 0x938557d6ccbb37ddULL, 0x387186b2c4af6932ULL, 0x32bdd3a30a8f2cf7ULL,
+ 0x7e7cf6c51736ee06ULL, 0xe2cfd1a32367e43dULL, 0x94e4fbe1a304ffbULL, 0xb7ff1cfb4d4bd934ULL, 0x693886a73d2f1cdeULL, 0x3ebe8643eda9f97ULL, 0xc774d9fa0d8a81e5ULL, 0x66100e99505a6432ULL,
+ 0xf61dd14305c0253aULL, 0xca3f3b2d2ff0064bULL, 0x8bc141cc918733ffULL, 0xcbf6c9cf6196011cULL, 0x18704e0457c6ebebULL, 0x62231ad258610519ULL, 0xe32d21d60a7b98d0ULL, 0x2056c9cbbbb4ae1ULL,
+ 0x52ef36f7a3f20b2ULL, 0xa01df9d40174f636ULL, 0xf54e9505afdd827cULL, 0x78cca28ae715531dULL, 0x6ecacdcf9446fef4ULL, 0xaf977d07102d982cULL, 0x87565f0971dd4affULL, 0x1ffa1a67a9d0241dULL,
+ 0x64167b0d6a526b79ULL, 0x6043a26126e10d89ULL, 0x87dd0399412903d7ULL, 0x598778a08edca4f0ULL, 0xdd0224fd442db0b2ULL, 0x585f59eeadee8115ULL, 0x2e8b9bc60694a24fULL, 0x31031a19f54b89e4ULL,
+ 0x941d6f4fbf8b01f8ULL, 0x1f27a852ebc690cbULL, 0xcc596a6a67a6f55fULL, 0x9d5046599defe917ULL, 0xa7d343dc604aae35ULL, 0x1b954036197b335cULL, 0xfd8d5300ab00cf5bULL, 0x7987ee011cd8b90ULL,
+ 0x373e340b5bb98937ULL, 0x6a3e20dd13002e67ULL, 0x22f2c2c24204d70dULL, 0x1c5ea50c0954a116ULL, 0x1d8dbec3b16fef03ULL, 0x2c158f7305483a5fULL, 0x73b00b40628f56fcULL, 0x9a1e40c99d0950caULL,
+ 0xac3ee162e483a578ULL, 0xb0ffa5e4cecb44c1ULL, 0x851fc97ffe42458aULL, 0x698fc6308e173dc4ULL, 0x79389b489e2fad83ULL, 0x34171ece27af0878ULL, 0x52db6e41a5c85706ULL, 0xac4ced9c67659d8aULL,
+ 0x77156c669e879675ULL, 0x8c0a1d26090253ccULL, 0x2defd603c6dfac1bULL, 0xe4d5922fdac30572ULL, 0x3a2d25fcc841fc69ULL, 0x4c5648631704ddd7ULL, 0x8953a6db5ed422d7ULL, 0x925a7d527201ea16ULL,
+ 0xc19e220398580649ULL, 0xb8b190b079862d18ULL, 0xa5ed4c0e7f52afe3ULL, 0x3a379a6d605da072ULL, 0xea9a1fd0a023ae9ULL, 0x24ec3295aee879e7ULL, 0xcc921d3ba3c32a3eULL, 0x7dd731fd7cfbb85bULL,
+ 0x5cd4ba8f0ec6fe3bULL, 0x44f71d92df6e5e54ULL, 0x66cd8d4a64f90e4aULL, 0x2346047301e1179bULL, 0x11137e0d98705938ULL, 0x403ea9e5c1cd99b5ULL, 0xfce9fb7c66c8d0e6ULL, 0x2bd29d1ab24b64b0ULL,
+ 0xfb7a35d032460ec2ULL, 0xc674d6dcda5c6e2eULL, 0xda1e18d0ce3dc762ULL, 0x31ca8444495fd48ULL, 0xef9a82f1c3c1f1a8ULL, 0x6585efd02eec08d4ULL, 0x16eabe49c644783cULL, 0x5b8d8e5150217af5ULL,
+ 0x81c2b6e14f58b6afULL, 0xea72c275d126d27fULL, 0x7261d435864c85ccULL, 0x397d68f97aa2eed6ULL, 0xb8300aa3a47c662fULL, 0xc31d91f8bc23fc6fULL, 0xb2d01d6fa3f7ebd2ULL, 0x9bd4a978c6eb8fa9ULL,
+ 0x4ab4d861d64a985ULL, 0x71021ea795e84277ULL, 0xe43651bd0d32a6c5ULL, 0x8866eff90a80c1a3ULL, 0x4bb041eec06d545dULL, 0x1ea9c81473a4c8a7ULL, 0x4cf5d704653d01e0ULL, 0x7f69e34701290cbULL,
+ 0xab394e70554053eeULL, 0x5baba9e43b719c9fULL, 0xe64bed9b6c7c925cULL, 0xa25f4d9eb227a217ULL, 0x253b1a05ffdd0ad0ULL, 0x195cbfe461638847ULL, 0x80c28a9961dc26b0ULL, 0x5e474f2c3a8860beULL,
+ 0x8baa3be62c708a52ULL, 0xd988196730371816ULL, 0x53b93e81b12e3f2bULL, 0x93663b93cc7961aaULL, 0x908175fe1fcc7b4bULL, 0xef925fd0296c858eULL, 0x1866517de3d50e3dULL, 0xe9179fc0060eb815ULL,
+ 0xe281b1cb64a01a0cULL, 0xeab27dc72edde431ULL, 0x8e7dbdc94df29095ULL, 0x8697a9f8a992c95dULL, 0xc7828e981b9226ecULL, 0x1d8102c2e5864873ULL, 0x4aa466e07413b10eULL, 0xb015e5753578d5deULL,
+ 0xcf4443153476b2b4ULL, 0x2a4d48ab832ff2e4ULL, 0xcf04ec2ff7ae5d99ULL, 0x146f6b2e0f7265d6ULL, 0x65a03392635886efULL, 0x3c16142a680754d8ULL, 0x324317d52f394107ULL, 0xf38dc3f0f41e35c7ULL,
+ 0xca4cb3cc0ea0c088ULL, 0x6d24fdb04dbb9353ULL, 0x777b42b2041fa237ULL, 0x1698e9d2dc07a0f1ULL, 0x124a1b782cb7c2aULL, 0x8e7f0cd85c0e2fffULL, 0x1fcd8004196ca195ULL, 0xdae1d10b61cbade9ULL,
+ 0xc047b035b3f7085aULL, 0xbd2f79973d23c69ULL, 0xd70a16bfc5282485ULL, 0x707ed9fb94f935c5ULL, 0xadf663cbe4b9588ULL, 0x41f067da2c2bbe3cULL, 0xba01b707f261bf1cULL, 0xc3e99b437c15ffe0ULL,
+ 0x30fcb226a8249b0cULL, 0xb2b5a2d3c3e312f7ULL, 0x6442aa950bdcd8aaULL, 0x51291a7bdeecd1e6ULL, 0xb23cef72c68873f9ULL, 0x5631bfeb34eb10ccULL, 0x5c00b3c51f5c8fa3ULL, 0xf8ee5c78fd64e5b0ULL,
+ 0x5183aa92ca94fa98ULL, 0xf654f206905ba579ULL, 0x260dce298242e4beULL, 0x56199cb4c0ff0d08ULL, 0x9dfd4fbeb3f39394ULL, 0x9d30c32d9d76b25cULL, 0xfbccd3f4132c40d9ULL, 0x8509d15c19d39c4fULL,
+ 0xf1e5e78e5b8b2bbbULL, 0x59290070d80213f6ULL, 0x6c742cfb3b3cd0c0ULL, 0x21f520021ff2764ULL, 0xaf7cc32ff64a0df8ULL, 0x3b7ba225f4078c2bULL, 0x1e0287d0c07cd6d4ULL, 0x8384867646d20c52ULL,
+ 0xdb9b7485d6a27543ULL, 0x307cebebb0f93b77ULL, 0x1b4088db27eb5143ULL, 0x27e32e7286e8373eULL, 0xbe5319c6b1cc67b4ULL, 0xa8d89145ef5cc9e6ULL, 0x708c2e59b9cdf43aULL, 0x7ccb12fa12e97dc9ULL,
+ 0xe66925f33439d1ddULL, 0x831788ea3ea861f2ULL, 0xe0a647855b4d1cdcULL, 0xbd10424b9805f0e1ULL, 0x21f8443960d7babULL, 0xb795672ae79077b5ULL, 0x9a4ab29ebe034f78ULL, 0x74120916dca7a900ULL,
+ 0xa593684725e99c82ULL, 0xd0f77ae5a13e6ff4ULL, 0xeabc8943355e2c48ULL, 0xe4f326209c862c78ULL, 0x26cea6b047b19d08ULL, 0xef0edd0c809d75b9ULL, 0xbfc77ac0f3889be5ULL, 0xf2a4f7b86cd4ffbaULL,
+ 0x38ac34f5aab10548ULL, 0xaed5a1dd1739c4cbULL, 0xf13ad226e2af0c21ULL, 0x1b27a07005f31281ULL, 0xf1c53e8819fcfb93ULL, 0x935d8a86413d82caULL, 0x881fa95ef44f066eULL, 0x222a860d6b5181a7ULL,
+ 0x7d61f9fad1a74809ULL, 0x8ba19fb1ecd0b2c7ULL, 0x40d6b73c4affc79fULL, 0xdbfed5a0b24615e8ULL, 0xc2ced5b7e3708408ULL, 0x229551a46ae30298ULL, 0x61bf40de5fbe78efULL, 0x1518762541717b88ULL,
+ 0x2ae81617bf8efbf4ULL, 0xd62b7b0c6a55a5b0ULL, 0xae198cba28f821acULL, 0x3c7fa9f2ff2714ffULL, 0x7a42715a0422a73ULL, 0x7464763cb751592fULL, 0xf63eac366fa0d05dULL, 0x59bc4909e24f0b1cULL,
+ 0x5fd92cca3a36511aULL, 0x1b24c90158018f66ULL, 0x2d04548eefce4cf2ULL, 0x80c26d8aa96d41b4ULL, 0x2876119dd349cc1bULL, 0x984bb3a8f83a646aULL, 0x57a88f1b583c34e1ULL, 0x6e0d94232e96c4c9ULL,
+ 0x5d5ba962e68e63fbULL, 0x50b9e40e73de0176ULL, 0xa6d59bd6f3a25bc9ULL, 0x2b0e4355bae35218ULL, 0x8c12021d3e17107eULL, 0x8a01b66fdda7abbfULL, 0xa6cac52acb8c0a2aULL, 0x713ebe61e5091918ULL,
+ 0xd1caa9d33200d264ULL, 0xc8728885d3b57051ULL, 0x3acaea3e082559c7ULL, 0xae7b734df3e6b406ULL, 0xc4c3ee11827e3ULL, 0x8cae11ef9f9c13f4ULL, 0xc6d5417cbec73fb0ULL, 0xfb3c42e099e7d83fULL,
+ 0x128794842f134b3dULL, 0x2c2c61a6ebaec0f9ULL, 0x84833f4fef835717ULL, 0x89c87136733febf7ULL, 0x5ee814c1a39030a3ULL, 0xff9ba5b9afc08ba9ULL, 0x7f790d0049916579ULL, 0xc0cf4f1854279ad7ULL,
+ 0x3e698d1774b75a35ULL, 0x60c260b32e876397ULL, 0xfcbe39c8747da2b4ULL, 0x713b975ace230d20ULL, 0x8849f26d9593731cULL, 0xd55f715621417f2ULL, 0x6bd04b07fa3da79aULL, 0x1c005425a83c1dbeULL,
+ 0x46f3603bde2c1cfcULL, 0x5a1df7af0f4ba626ULL, 0xc2f382a29a35e1eULL, 0x6e683be33ebf41d6ULL, 0x95b1ed2f1c306298ULL, 0x4d4ac3751a7293dcULL, 0x6b1ff603aa3daadbULL, 0x38184a79414359f7ULL,
+ 0xaf6111201e04f69eULL, 0x3d86aa8a73bc2b6cULL, 0xc50046d6dbb2a309ULL, 0xb7a1997f2bf73e46ULL, 0xa4090ed1037984e7ULL, 0x5ae78077205766c9ULL, 0x128b33c5f1e87595ULL, 0x7bb67c6ed40d04d8ULL,
+ 0x28246199f9b7b8a8ULL, 0x721cfd9c49afefa7ULL, 0x2c3f533d592130f2ULL, 0x79f55bdc357b13d7ULL, 0xd1c6559128bf5cbbULL, 0xcf7d5c7f8a199e44ULL, 0xb202a0caad7d6cedULL, 0x402711fd9a1082b3ULL,
+ 0x37c7a421f0df5249ULL, 0x7d72bef4166405a4ULL, 0xb5b4c07b7dc0024eULL, 0x85426511fefd6624ULL, 0xdef72b8ab9559622ULL, 0x8dfdd4bcdce577a9ULL, 0x93769b936be61c1dULL, 0xd8a16deda7feb61eULL,
+ 0x3321d959ea5035c2ULL, 0xa30b8e37dcef258cULL, 0x86c0d2439ddff9f3ULL, 0xfe410f9640ec8906ULL, 0x332c9b7998e3888fULL, 0x4b5181b7e6595afaULL, 0x71b88e1d1d9564f3ULL, 0x5ac7bf7d2d3e24f6ULL,
+ 0x1b904766aa39cadeULL, 0x3532570b26ae73eULL, 0x94c46c843bdef30fULL, 0x80d07a75024f87e1ULL, 0x2b9eb1fc51febccbULL, 0x4b269d8ba0eafcfbULL, 0xb756e5aa5a078e9ULL, 0x98d3570dd08781f3ULL,
+ 0xf46cbccec957fbfeULL, 0x5c22b7fa14e4c6bcULL, 0x47149b7c58bb4acfULL, 0xfa386495f62146c5ULL, 0x38f288340561f0c5ULL, 0x21acf0ac69ac5e67ULL, 0xd7d99c59fb7decdcULL, 0xdcfc6eb9371fe322ULL,
+ 0xc5608f8c47f585a1ULL, 0x198669eb40e5f846ULL, 0x894e9219aee303c0ULL, 0x55a9ad2a63418c73ULL, 0x72f66004cdf82d6bULL, 0x477ee6684cc1ca9dULL, 0x49fab1425d152b27ULL, 0xe19bb4da0689b7f0ULL,
+ 0xc4b8a9709854a2a0ULL, 0xb1b7ec272792daddULL, 0xdad5f3ce0221e33fULL, 0x1a7accdc21ed563bULL, 0x1a2ade596e3600abULL, 0xe9bccd9da6107339ULL, 0x8fce98abff712630ULL, 0xda9aec6ae7d7f6ebULL,
+ 0x356da6c8e494bf4cULL, 0x38096af5a02e3ee7ULL, 0x1a2330da2c57a810ULL, 0xb6c86208f9a64534ULL, 0x1eb74103d13f28abULL, 0x6a949ad6e0314fafULL, 0x9de1fe4ec906e5a7ULL, 0x8818326b671731dbULL,
+ 0xea1c298587b86800ULL, 0x156c403dcfe5a208ULL, 0xc031ff92ef11eb44ULL, 0xc17b5c75686c7d6aULL, 0x77100ff2799e9954ULL, 0xe56c4bb017513f39ULL, 0xb942284aef94d543ULL, 0x3ade24169ad637e5ULL,
+ 0x1960dc40417b0f22ULL, 0x9ec604de998e8a13ULL, 0x8139c535cc4b0618ULL, 0xe2a98bd84d5ca455ULL, 0xf83391ace0226e82ULL, 0xc89769791e4720b8ULL, 0xcfc17e42eff2e609ULL, 0x28af1a602497e701ULL,
+ 0xc0308caaefe96c23ULL, 0x200ed1416f06d696ULL, 0x603e468d3846158aULL, 0x18f250117b6e8b79ULL, 0xb2e2f3c728bd767cULL, 0xd1630179a2fc4924ULL, 0x6e19e31cf0489f40ULL, 0x3451fbab9502495cULL,
+ 0x77839ce65ef01d5dULL, 0x28e943b0cecaca6ULL, 0xf7775b83bb06bca1ULL, 0xcef9bc21cd9ff14cULL, 0xe138ffdf293a4931ULL, 0x9c73b4e390bbc630ULL, 0x4a53755ff0558018ULL, 0x4038652c2f7c222eULL,
+ 0x71f92a9ca8b7e183ULL, 0x334e180a56f8f18aULL, 0x85edf93d98af40c7ULL, 0xa4b19414602b88f1ULL, 0xb975b8a570cb5d96ULL, 0xdde97e7c4e37185eULL, 0x1c0596524717ad2fULL, 0xe9c1887c18242a34ULL,
+ 0xc615cdc4064770f4ULL, 0x57f93a60a2927482ULL, 0xe25036814d54b610ULL, 0x785c4f7456ee2674ULL, 0x2327c8f728aa3e71ULL, 0xa46649d291094ebeULL, 0x47d2adac1c7f8a00ULL, 0xc6b6cfe152dcf845ULL,
+ 0xa07ccc3dc513b821ULL, 0x3680db433c37c8bbULL, 0xd53cb061e6f1f1ecULL, 0xa1f56a1f3a8c48ffULL, 0x72dc488f69a8f3d8ULL, 0x47ea52dcd9e7d22fULL, 0x317a64af6589938cULL, 0xcbc09813a33bdff9ULL,
+};
+#else
+static const mp_limb_t ecc_unit[8] = {
+ 0x1ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+};
+static const mp_limb_t ecc_table[2048] = {
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x3ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x89a589cb5215f2a4ULL, 0x8028fe5fc235f5b8ULL, 0x3d75e6a50e3a41e9ULL, 0xdf1626be4fd036e9ULL, 0x778064fdcbefa921ULL, 0xce5e1c93acf1abc1ULL, 0xa61b8816e25450e6ULL, 0x7503cfe87a836ae3ULL,
+ 0xf09d89731510b33aULL, 0x5990950115125d8aULL, 0xf29037e7f630e13aULL, 0xe5caff31d031d853ULL, 0x5dee8b4917e3675aULL, 0x7a956818c6b5eda2ULL, 0xc2fdbb0ae30a0b3aULL, 0xfc44891565445e33ULL,
+ 0xbb4b29ea73c034bfULL, 0x74ebb4e88e23439bULL, 0x96594d45f613096eULL, 0x4029ea200c7c4b6dULL, 0x4d95af09f15b4fabULL, 0xc96e40c7efa4bc13ULL, 0x87323dd1c2cc8801ULL, 0x8cf28a47ca792c90ULL,
+ 0xf143a80e4b5af16bULL, 0xf1470a8d0b0ccb6dULL, 0x8c869415d383cd2eULL, 0x25d30034b667805cULL, 0xc3423ee830136564ULL, 0xf9eb2dee51adbfe1ULL, 0x1704532e5d97a348ULL, 0x73de451294e59114ULL,
+ 0x28abff30b91412eaULL, 0xe73a34aea89dc402ULL, 0x9348baf8481c3ac6ULL, 0x153844ab5d8a4127ULL, 0x9fbd304ee83bccdfULL, 0xb9395802d5555f07ULL, 0xaa460afb9517fc4bULL, 0xfc162116dc8a2870ULL,
+ 0xb34a14d950b5a248ULL, 0x604fc0c851c0211dULL, 0x391ca41a95b488d5ULL, 0x6768a4d627292fd3ULL, 0xbc9bc22bddfb3e54ULL, 0x3b53bb28d34ef1ebULL, 0xf0441f120fa11b0bULL, 0xb6cdd898a2822ea1ULL,
+ 0xc494e3e4ed50b9e6ULL, 0x7af5f010e8e83d3bULL, 0x3a9f348af9364e92ULL, 0x2852f0407fc6dc63ULL, 0xa6a1a672c9ed22a1ULL, 0xa2fcd8ac2f019540ULL, 0x5212bcbf6490a5bcULL, 0x9dbce605716b20e0ULL,
+ 0xc7f0d39a4460739aULL, 0x40e8cf5087692558ULL, 0xcfca7a745c6ae5f3ULL, 0x26b3c4cf6c47ec01ULL, 0x8afdbc42ede974ddULL, 0x96c9db5b4e76d94dULL, 0xc630f395f4fc72ULL, 0x898cc032a1e31127ULL,
+ 0xcd86e1f911bd0be1ULL, 0x37df44f41d20680cULL, 0xdcf2a51e0bd9a3d0ULL, 0x1633d5de6a96e32ULL, 0xa4164c032b7d1887ULL, 0x29b6ed833d8bc5b0ULL, 0x2684d01887d681caULL, 0x13d1f1876b4c34bdULL,
+ 0x874fbaa2e107462fULL, 0xd291f6f6417ad828ULL, 0xf8071115a6fe73f9ULL, 0x3237bf3c3e65fda6ULL, 0x2f227f680cda4281ULL, 0xa31f282887926456ULL, 0x61e3b0b94af0f970ULL, 0xf4059f419a207266ULL,
+ 0xaf26473aa80ece81ULL, 0x50f291f7fd322c22ULL, 0xbb706b82f85b4d31ULL, 0xcb26510bb90b101aULL, 0x1b081512d5844659ULL, 0x3d0b1c4377bfaf8eULL, 0x2ea9eab65e99f600ULL, 0x929f168b42ab277dULL,
+ 0xa34e521356dff90cULL, 0x4c4fe8fc7e68d021ULL, 0x7510a79256929d0ULL, 0x4858f3fe0ddd08e2ULL, 0x289f5d3e0b92f9a5ULL, 0x46b793d7d32e0182ULL, 0xd21a62cbc1380b77ULL, 0x5a648ab4b8acf806ULL,
+ 0xdf9f75d3fb76bf4dULL, 0xf10033afa65ec6b9ULL, 0xf518149986c7da59ULL, 0xb39bec8c9b8a4edaULL, 0x7fb448f5a1f635abULL, 0xf959af99c898d92dULL, 0xc3926af6c4098787ULL, 0x26b80fd60e6d0956ULL,
+ 0xdb27ffc83fc60066ULL, 0xacbcbfa444870667ULL, 0xbee2f3eb6b242b96ULL, 0x394329a3f49f98adULL, 0x1bad1867b4c3678ULL, 0x9a8f9a4ced8118f0ULL, 0x4a617a3de9441e53ULL, 0xb2c4d3de22fccfdULL,
+ 0xdd09628922305001ULL, 0x7b16bb81c47b2126ULL, 0xe82f11291c0a8d75ULL, 0xc53283d471be2e4eULL, 0xb6d6bbcbf3a93b88ULL, 0x73437122ac2156c9ULL, 0x451809fded27ca2ULL, 0x9c78e9750da9710cULL,
+ 0xc1515c0c3e163a09ULL, 0xa006bc7b3d3dd15cULL, 0x13d5c0f59cd3afa9ULL, 0x40cc3951c26b37fULL, 0x31d10bd9f1787e7bULL, 0x32e246dce83844b4ULL, 0x4f9aa4e27f36bbdULL, 0xa332332854491750ULL,
+ 0xdd10ae184c7ef142ULL, 0x613293dc12218427ULL, 0xf30ab39fd38b6672ULL, 0xfefdca532c87d470ULL, 0x8544dea86049b855ULL, 0x1c9699c7367fcb3aULL, 0x2b1c85249511004bULL, 0x5dece8508f51e227ULL,
+ 0xe2e63648bba69a78ULL, 0x83581fa47c5fa46cULL, 0xce6b680d935378f6ULL, 0x56ab6bd8974211eULL, 0x2bafe1979b97ac0ULL, 0x9613bef58d35f156ULL, 0x2e47316417ed213fULL, 0xbc801d59ae84b639ULL,
+ 0x81c96ff79767e068ULL, 0xc1c6d2a9ea6c83d5ULL, 0x173eaf47d1e3c922ULL, 0x8fcebfcabc8e01b4ULL, 0xf2777c8e79513d4fULL, 0x570f674192b0788ULL, 0x4e5dc57c631ba1cbULL, 0x496031423cee1b3dULL,
+ 0xce427a7bf8592903ULL, 0xe61b7d485a34add7ULL, 0x56724c010a0c24dfULL, 0x924308d32a9bd31fULL, 0x97c9e8ed6f2cf552ULL, 0x75a301030663cb4cULL, 0xd861c1eab4dcee25ULL, 0xd11f35c575fb7c48ULL,
+ 0xb8612141200a5c4ULL, 0xb170a13bdc2a83d0ULL, 0x7b3d408b4ab7bbb5ULL, 0xb7f3d481b2a9b3c3ULL, 0x7c7d935d8e6f884eULL, 0x9cece57f05ece3b0ULL, 0x1de77a525fee6870ULL, 0xb6966926fcc968adULL,
+ 0x6297cc40239f272fULL, 0x90a425b0b57ee2c1ULL, 0x24be8c2a83d339d2ULL, 0x4adc8f4ffeea242aULL, 0xcb9dff2e66c70182ULL, 0x18d6a12c78301bfcULL, 0x4d012bbfada93c85ULL, 0xc19b31ee5595c112ULL,
+ 0x6a16d54e0b1acff2ULL, 0x461c37b77ffe425dULL, 0x89de043573712396ULL, 0x98a1ee58ba282909ULL, 0x90b0e1538131eea0ULL, 0x90bcfd1882ba555bULL, 0xcd86e5f8c6c18cccULL, 0xf66b402f99fde693ULL,
+ 0xd980350a9ea0266bULL, 0xa518c8429f5402beULL, 0x680b2a4dae9a5702ULL, 0xbe3c4f358c4ce366ULL, 0xf6d5af96ad4e2d8dULL, 0xfabdbbc094a6d54dULL, 0x9c5540a04ab5b599ULL, 0x5020bcbf0bef871dULL,
+ 0xc2ad99fd27ccba4cULL, 0x89420ee4c492b7d5ULL, 0xb5b9e2a8f0479b8aULL, 0x8e40148191fd19c7ULL, 0x6735937c3fbcc7aULL, 0x8ff82dcf1a65f6dULL, 0xdaa08c51950a31faULL, 0x6e724111d154bda2ULL,
+ 0x548c96d5eca8807cULL, 0x3ba3470ad45e19b6ULL, 0xc8e7b15c68233583ULL, 0x736b6c71eca18747ULL, 0x91c269fb453fdbaaULL, 0xeb3bb493865d3315ULL, 0x2dc3506a49055d6fULL, 0xc505c9e8e070fc87ULL,
+ 0x450b425644a6e3a8ULL, 0xf4fed6e0f4a84f44ULL, 0x9905725955d312a0ULL, 0x2bce381635e3aefaULL, 0xbae3050f945d3fa0ULL, 0xdda9e74a6de8c6fbULL, 0x7ac32f3bb10f4f7cULL, 0x8e7186569a223b01ULL,
+ 0xe924cca98363779eULL, 0xb5d2f1a1b499421cULL, 0x7d0a75a02a2c8c2aULL, 0xbeb7ed4cc6cb3123ULL, 0x73348d9522c8672bULL, 0x6f201d282c9a2d72ULL, 0xce5ccc3e53c357ceULL, 0xc9b656b67770f5c3ULL,
+ 0xf08461be87435794ULL, 0x5f1a4092851d28c9ULL, 0xada298a8f03b2b7ULL, 0x22632a6e5454f538ULL, 0x2d0e9cb9ca1341d9ULL, 0x1068131eb14e1561ULL, 0xab69672c7a0875f7ULL, 0xdb1a44082e71ec40ULL,
+ 0x14396968a6c2f690ULL, 0xb9f5f128c3902cf3ULL, 0x7c8b7cc6b6ff7b04ULL, 0xd3a1d37d11ffb337ULL, 0xa965477e01ff37a9ULL, 0xc59274441cbfeef1ULL, 0x30ce24070d5de63dULL, 0xf5bd5046df5a1030ULL,
+ 0xc1dbe753b990d923ULL, 0x7718815785566adeULL, 0x773c2be507849301ULL, 0x234b2b7d27927d70ULL, 0x7fe8e7c687e22228ULL, 0xfe831965ef0b97ecULL, 0x7308a745fa6b836dULL, 0xcc2979d3a9c9da91ULL,
+ 0x36cc8b353006b588ULL, 0x178f9872fb2d1f38ULL, 0xae9f33a5c1a5c068ULL, 0x899c90224aa01a2aULL, 0xacec7d921b26bc27ULL, 0xe288318de6066809ULL, 0xcbd3fa4f50800c0cULL, 0xca091ffba4ac356fULL,
+ 0xb9097f674926b43ULL, 0x1fccd44ecd62e91fULL, 0x87c14338d7e51519ULL, 0xfeba7acab78be653ULL, 0x9733f12308616ad3ULL, 0x877ff5d6d32e4bb8ULL, 0x75f4166e2de87baULL, 0xea31abfa22c73707ULL,
+ 0xfea5ba6f816b73edULL, 0xa16c13af0ae733f3ULL, 0x727f6ba257495c39ULL, 0xeb4b05f424fb80d8ULL, 0x3dd68fed533f400cULL, 0xc65e10798049706dULL, 0xe4127472bb9dd117ULL, 0x8b198d925d8271b6ULL,
+ 0x809c7b5db06363e2ULL, 0xe9ac961e37e536faULL, 0xf2db6edbd0ee7a97ULL, 0xa8b076a2806fc957ULL, 0xc17f16ff6ce9c26ULL, 0x13f6bb766b09825fULL, 0x8fdb263925d370adULL, 0x2d23b930b955d8c1ULL,
+ 0x9eac43a093fffe49ULL, 0x34e637e25055ed05ULL, 0xee9a9db64b7a40fbULL, 0x8e394b5a99474c73ULL, 0x1bde98a3f25ac823ULL, 0xa8ff251c2b446c92ULL, 0x96aef9acacdf26ebULL, 0x8c97634ba78b7af5ULL,
+ 0x2c2cf10f1a847be6ULL, 0xcb363337d0f25b9eULL, 0xfbf7dd0099f3ca4aULL, 0xc2ef54a83494818bULL, 0xc6862e60039993c6ULL, 0x4f35fc3a2d904b53ULL, 0x18c6af9f287097b1ULL, 0xe12fc820f73c6fc2ULL,
+ 0xe6961991f1698618ULL, 0x3684d7ba552349d8ULL, 0xd2ab6eab3a3b0531ULL, 0x42638c929b484b49ULL, 0x4bbc14359b9bd609ULL, 0xa56d2f9874809b7ULL, 0xc22a4232fc148b2dULL, 0x72bb7b2ffceadd57ULL,
+ 0xa17167f056aa96adULL, 0x84e3aa91a30f28d5ULL, 0xe9d10ad1ef6347a7ULL, 0xec6a6e07f48c8162ULL, 0x8cc420eeb8fe93a0ULL, 0x1ec66cb63b83e545ULL, 0xbcce7924adddb0d7ULL, 0xf3ad3b1dd5ca9fd1ULL,
+ 0x4fba111c3505ee34ULL, 0xc140590fdb999eeaULL, 0x4533b329322aac49ULL, 0x51ca2ca43b35083cULL, 0xa7eb81fb87d3cd41ULL, 0x6e3f753bcacfde88ULL, 0x6aaa507e12de103eULL, 0xc2e18ba8499dac5cULL,
+ 0xe7f470a34781d611ULL, 0xd1e8268af56f0b7eULL, 0xb6cb9af6529fe657ULL, 0x29b9110277c15de0ULL, 0xd2ed14c444030460ULL, 0xa373f04283493c33ULL, 0x4591c6a2bf13d7ffULL, 0x944dcf8990d9d462ULL,
+ 0xc69d60bb8f261718ULL, 0xde3d9921684c442eULL, 0x9541d1bc27853374ULL, 0x377d8a6322ccf8d2ULL, 0x59e8f38ce8d1eb4eULL, 0xd9ac73e2832fc225ULL, 0xf411f9b8aec43e42ULL, 0x179374bba2d10860ULL,
+ 0xb4a144148e109ea2ULL, 0x46c07fe6dc983cd1ULL, 0xc41edd9278a62c1aULL, 0x88230174f2d72d3bULL, 0x3ace276c4125fcafULL, 0x1ed7ebc0462da854ULL, 0x34e3d84c98f9f98fULL, 0x91e7c8471f03fda8ULL,
+ 0x84a342522d96935dULL, 0xa4d586dd72d95b19ULL, 0x6562f1ff26d9fa13ULL, 0x6e22e7d88194120bULL, 0x8f97989262818193ULL, 0xae4bd59685305232ULL, 0xf32679d951f78c0fULL, 0x838165e2f982d31cULL,
+ 0x673dc19a610a50b7ULL, 0x86a4b653b50bcfb6ULL, 0xe20c234c86915223ULL, 0x61247e4c174bb004ULL, 0x5d9c81b1a3189e6aULL, 0x2f3ec81345673092ULL, 0x56cab1e504d2b70cULL, 0x8d948565ec92b8fULL,
+ 0xa55770c182d9f4f2ULL, 0xa45724218d8bc71aULL, 0x3000f024029823fULL, 0x688b806d9cc4c131ULL, 0xd1fb98ea451b427ULL, 0xb59f87d34fc05c6bULL, 0xd1cd5897e9905edbULL, 0x484a127ffce43907ULL,
+ 0xe4f4a92d2bcf367dULL, 0x1a7baa3ebb5621baULL, 0x9f9aef052080ee84ULL, 0xa5dfb60ec08c09e7ULL, 0xec09231ce1f3f037ULL, 0x11750507693d8610ULL, 0x2280b5727768a574ULL, 0x83229d39cebd9c9aULL,
+ 0xd0b1577876bbfd06ULL, 0x59205104d32f5406ULL, 0xa7035a26e4387577ULL, 0x5271a98e833a9e8dULL, 0x690c7b5120b12517ULL, 0x5a91f115919772c5ULL, 0x12c638a8a42ff04dULL, 0xf93a912014db1586ULL,
+ 0xae6bc968c3360fc7ULL, 0x406d69e7f404688fULL, 0x1f1fde792e3cd0cbULL, 0x74be4e309bfa81baULL, 0x2f5a56542b011447ULL, 0x18ec4965e1a739dfULL, 0x188c8f604c44ae89ULL, 0xc322f6ae89d62199ULL,
+ 0x7f34ed1bcf02fb20ULL, 0xdc2d18a35a81d96aULL, 0x30603144145f3203ULL, 0x489f3e600bb47c92ULL, 0xd71c6803d14d421eULL, 0x37cbf2bdda89c067ULL, 0xf2a6dfa7e6397a79ULL, 0x86249df501c88b98ULL,
+ 0xfa36599f2160b7dfULL, 0x8073d6f7fe1fba78ULL, 0x90d6c3ab44f1bebeULL, 0xe9bfb878f5e9afcbULL, 0xd73a8c9635eea7afULL, 0x9116211ce194bcf5ULL, 0x3d34a8263b4ad4d9ULL, 0x5d438cf921d9c311ULL,
+ 0x644646ffc96ea9a6ULL, 0xfd4801e76d2b3e00ULL, 0x1b12e36e18d5811dULL, 0xec4f9478734e6d25ULL, 0x3e2d2668359a592cULL, 0xb7800f74588f7647ULL, 0xe73635fe3d213540ULL, 0x881a8fc1a75e04e4ULL,
+ 0xf80edfe18b9cff09ULL, 0x9c1a5db362b3899eULL, 0xc714af776edac689ULL, 0x7e7ecd984d158e42ULL, 0xd982f8fea84372c8ULL, 0xc3d8485dd2fef8eeULL, 0xaa7a06eb544dd5b0ULL, 0x8e4efc92cb848c85ULL,
+ 0xaadc73b3e16b2dcdULL, 0xf0d4a168d5380f5ULL, 0x697a3503434197a2ULL, 0xfc03fd5323556634ULL, 0xd1afd9689718f6dbULL, 0x389c413112ab3f56ULL, 0x24fcb82c68f1ebfeULL, 0x31ab63837d9e8006ULL,
+ 0xb1ec3c370d2a0ce9ULL, 0x2c4f68ca2ac7f99bULL, 0x961f55c15d97f8e1ULL, 0x9e770f31424199c6ULL, 0xea7e616c8fc02b5ULL, 0xc182fb58b51a74a2ULL, 0x469503a5ad62f64aULL, 0x6b396065264a2699ULL,
+ 0xe7bf12625ec6efe0ULL, 0xaac820a6ba79e93cULL, 0x5052d902a060e9dULL, 0x2b1c7df01a498617ULL, 0xd9ae82417fd871bfULL, 0x6558a25cd3421483ULL, 0x9f8fbf20a0915a39ULL, 0x641ad89f8adee879ULL,
+ 0xfa122e4d90c5f92eULL, 0x4104e16bf3552911ULL, 0xce628fa09d67421bULL, 0x81ccf39779652188ULL, 0xd0fe57e9631cc54bULL, 0xd65d4520aa5e93a7ULL, 0x9dd1c68b3ecc908eULL, 0x3c4f1df8cd1ea333ULL,
+ 0xcb79291c7237828eULL, 0xdb54c3a0b6f70fa6ULL, 0x35cc101e10235a28ULL, 0xcf77c13c84e41906ULL, 0xf2b043886247bc49ULL, 0x72830c3d65d69f35ULL, 0xc128f266fbb2da08ULL, 0x316ce785394e90a7ULL,
+ 0x8729b0b13e69249aULL, 0x5fcebae360aa2364ULL, 0x7ee3bdb04201e367ULL, 0xd6cdf865fe4b5609ULL, 0x48da443a118ad798ULL, 0x8a89848ca907b8cbULL, 0xc256a23afd6222adULL, 0xd4fd513bbd1ec4e7ULL,
+ 0xbc2f618f6cd2fb71ULL, 0xb5737961b21d7cf9ULL, 0xfedb38240aae1f52ULL, 0x664168d12cc5c01bULL, 0xcf559a6f6eb3e1b1ULL, 0xe051ca99cfc8ef69ULL, 0x9827478861bcf33aULL, 0x352bd9ab41adf3b2ULL,
+ 0xa25b7fa378d0a8e2ULL, 0x2db8fe2eddff1a65ULL, 0xf79a3868488dd326ULL, 0xa5f67de05610e753ULL, 0x77a1d91d34e5eeccULL, 0x5c90c2fbb52bc7cfULL, 0x675dadec041ed2f0ULL, 0x8af860b9f3b3a3aeULL,
+ 0x93c8e63357dbd4c0ULL, 0x86d80bf0d45d892fULL, 0x118fda9e98cdc94ULL, 0x21819a8238bc69eaULL, 0xb99ab4501df9f5d1ULL, 0xa4eef5e59ed22fULL, 0xdc76c6cf223b68f2ULL, 0x702de06f0c4c7da1ULL,
+ 0xed9d1a6f9aec94fcULL, 0xe68451315f04f369ULL, 0xe4491ebb8cc49da0ULL, 0x2dc301faffcd0152ULL, 0x38f1ddaa4dcb254dULL, 0x906c26397c619c07ULL, 0x5a75c15ad8a03622ULL, 0xf13a7b9207e3cf2aULL,
+ 0xc1c151564827d602ULL, 0xa6dbea89999f1d90ULL, 0xa2ee8ed89f5353c6ULL, 0x6c4cdc831d51c60aULL, 0x359d59722ab49dc4ULL, 0x6baa45697ab23993ULL, 0x6244aa3234f3286fULL, 0x22d8a4d50a37836cULL,
+ 0xaaefb00fc65dfb99ULL, 0xced887a2c69c48d5ULL, 0xdb5b56504acf161cULL, 0x4e220471597d364ULL, 0x8b7c8c42fe8b11a5ULL, 0xa7ef4c9eec427b5ULL, 0x7fbceac38ec1b6dbULL, 0x8ce13c9a1c445e1cULL,
+ 0xa0788969f9b1ee8eULL, 0xb4408b5ca8c5742dULL, 0xbe7f56d0ede8a427ULL, 0xcdbc72434d688028ULL, 0x76a85fc1c894b9c5ULL, 0x42773cb2ec31a564ULL, 0x1e3c295c50118243ULL, 0xc224455481a15eddULL,
+ 0x79da69d5ce7e55b4ULL, 0x9055baf7cf73a620ULL, 0xb3f9e84ac5afe6feULL, 0xb4bd071ba6198a20ULL, 0x30ff44fd17737db0ULL, 0x1d9a164f987843ffULL, 0x3304b0e63d2be754ULL, 0xce8a03b69d82a80cULL,
+ 0x15e89cd507770815ULL, 0x9869ce6c8a0c9e04ULL, 0x12706a445aa7b72fULL, 0x6ed89ed0c106d9dULL, 0x7e739fdd4ae9cc5bULL, 0x7ae4455b68227041ULL, 0xf1fe0c25b7d7ccccULL, 0x85a6cee99e39cedbULL,
+ 0x7bcb0f798b61070bULL, 0x6895803963cbfe8cULL, 0x5b81cc9bb6c8e748ULL, 0x19b68e5b59e8b7eeULL, 0xfbc837df9dfa592fULL, 0xefa21aef28221b0fULL, 0xa1452c62bff424c8ULL, 0xd74357a4f698f4f3ULL,
+ 0xb794aff4846ca53ULL, 0x85b371dcbf405fefULL, 0x7192f4a9059ae29cULL, 0x901d8feaa2dd7660ULL, 0xceed62c11ab44efcULL, 0x53b63579a8349573ULL, 0x8ce395a71dabf94fULL, 0xeca0c8725727b83bULL,
+ 0x97ae2f6e36dafe0aULL, 0xa5d47cabca1cca8bULL, 0x31b8a0599687a068ULL, 0xf7f49eed2371ec06ULL, 0x7e64a26fe1ff5ccbULL, 0xc0da6a4a0e7cf270ULL, 0xeaa52afb28ef946fULL, 0xfcf34163d9b940ddULL,
+ 0x72957680d37aa81dULL, 0xc25825b440806710ULL, 0x7367d48a9dc77589ULL, 0x1119332b65f3e8aaULL, 0x906795a732d986b9ULL, 0x9761ddf42adc9be2ULL, 0xfadf068cd4eba240ULL, 0xaafcbcf3b91389c7ULL,
+ 0xd97decd2ff4c4fa6ULL, 0xd2c3896ce97a7428ULL, 0x91a00cb6915808d6ULL, 0x2e005b9ff0baec7bULL, 0x4ac855ebf54c2385ULL, 0xb14d35e8d4773235ULL, 0x86faf7f0dd24d1ceULL, 0x694282f54a4be1dULL,
+ 0xd551884ea1ddfcb2ULL, 0xc68ec762e91b3dbULL, 0x3100abdd27189904ULL, 0x2f0d6e0308c095b2ULL, 0xfd51ba5d9e3acfdeULL, 0x1003f059bb071598ULL, 0x9898712f06f9eef9ULL, 0x2ae0daecfc68b7ecULL,
+ 0x6abeb3d00e4edc5fULL, 0xc03c3ae21960cefULL, 0x18456be715fdc33fULL, 0xe9cfa15516d27ef3ULL, 0x13b6fae99b04c324ULL, 0xe72347d073413f8bULL, 0xe96ee23dbdc4874cULL, 0x394f835fd485b848ULL,
+ 0x8f64edefd04bc256ULL, 0x441af841eb786c2fULL, 0x949ea0a1c5bbbe74ULL, 0xddd6c13d198cecdbULL, 0xf8871a89ef9f0881ULL, 0xc79c9fbd89c8a613ULL, 0xee67b89a98e8b33aULL, 0x7f674cef89482d41ULL,
+ 0xd6c8d1d39f99b03eULL, 0xa347e4e5e73748ddULL, 0xdd189176df454d65ULL, 0x156b23a6c318cb07ULL, 0x6ab8df60be245473ULL, 0x489e295e44460665ULL, 0x2400fa3ab4ebb4aULL, 0x472f0f310d477830ULL,
+ 0x15a5003432fedbb0ULL, 0xf18b7f4e9d2466d8ULL, 0xc5aeb632e8226217ULL, 0xf9567166b684167aULL, 0x42e9d48fd6e5b9cfULL, 0x275e19a5f9fd44f9ULL, 0x511698bbfe288a40ULL, 0xaac2bc87ca708099ULL,
+ 0x60abf55a299c7ebcULL, 0x4a3abd73df983b19ULL, 0x17bfb237233b5904ULL, 0xacdc596e10591ca6ULL, 0x63d784b031f2f6aaULL, 0xa8d2b1b4d82d3cb7ULL, 0xea026ec14ef8d2bdULL, 0x69e20cdf93424c7dULL,
+ 0xd86663e22766ef16ULL, 0x4d54a682406bc165ULL, 0xa2402b056f6a64f7ULL, 0xc86efd6ec6c546caULL, 0x5160119b04884b00ULL, 0x86b4db2368d849acULL, 0x9d1eadac72b3e07ULL, 0x201ac69199d981b9ULL,
+ 0x278bba66dc66b0d2ULL, 0xae26c58a290ce353ULL, 0xf1a778004e0216bfULL, 0x7ce5a173f0a57df7ULL, 0x73f97f2063e984c9ULL, 0x89582c62b0fcffdbULL, 0x3eb9352807a3d6c8ULL, 0x3617f09c359c3e7bULL,
+ 0x37afbd618f28346aULL, 0xf2149f20a63e9c66ULL, 0x638c332db2c91957ULL, 0x10c376ebe64ad6bULL, 0x926f584f68b38c7aULL, 0x868b64f43f07d3d8ULL, 0xe09b46fbf3f5f5a4ULL, 0xd806ef96fa837dfeULL,
+ 0x539d574f4f468e2ULL, 0xc78ef8d4d901b287ULL, 0x46d8e58656ea5ec5ULL, 0x8e0505a5a2bf27c1ULL, 0xf586ea979c1e0a5fULL, 0xb0fdb723ae81ee4aULL, 0xdf83e6d5330a661fULL, 0x10cfb926204afabbULL,
+ 0xc4a7d0b491129e3fULL, 0xb2d148d733bd34daULL, 0xc60a3e7f96482adeULL, 0xf9f42958c6e539f7ULL, 0xbc43ce10551d5b9aULL, 0xad8f10c3f639478cULL, 0x16e88071acb000c8ULL, 0xd2574f318d4b3803ULL,
+ 0xbf255c6e2d533e33ULL, 0xc95a6f2a477a3023ULL, 0x21c92546b6a4621eULL, 0x1d46c16a04b9ddfbULL, 0x8351d787216f22b4ULL, 0x5cf319fa6ead1f45ULL, 0x664d87adad2b0964ULL, 0xff9d3cfabd063222ULL,
+ 0x32ec1b245913d42bULL, 0x588ada7e8f22efa9ULL, 0x678f4a6d62639adeULL, 0x59e8bb9421a4b201ULL, 0xdf39bb447da4a61aULL, 0x72f8b7002053e5bULL, 0x8a1d57070c61881bULL, 0xfdaaece0bb5cbe52ULL,
+ 0x1f7a43ec83a08870ULL, 0x4be8e67091921115ULL, 0x5501498e0f7defc1ULL, 0x41a0bc135fc93f69ULL, 0xac0424c08fd6b672ULL, 0x455bb4aea3abbc7ULL, 0x9f74e9ee7f6be9f0ULL, 0xb93bb6abd70fe0f9ULL,
+ 0x9bcaecd04315b10aULL, 0x256b5836771f4745ULL, 0x9442775e2ca39dc9ULL, 0x65f1cd0d65bde132ULL, 0x1428d979a4471f2fULL, 0xf2a5ead89d55b7d4ULL, 0xf453f8cf6a952f0dULL, 0x1153e3d9cedb9d69ULL,
+ 0x2c191fd211e2fa07ULL, 0x3a9622d43f9bf46aULL, 0x4b8e897e9ca19bf6ULL, 0x4310ad9da8d84441ULL, 0x258708038309c973ULL, 0xbd3d3e4bc073a035ULL, 0xc614094414b3fedaULL, 0x6d2d1b4ba705e251ULL,
+ 0x1fe112b7d9a25006ULL, 0xee018f592cec768ULL, 0x9e039161380f6894ULL, 0x5e43caa43fb9c871ULL, 0x954ce50b01b8a7dcULL, 0x6eed5748f255d704ULL, 0x9ec2095abbc21d15ULL, 0x4d979cc4e461675cULL,
+ 0xc093b81075e5f74aULL, 0x6ab8a57ef51b8156ULL, 0xda08a9df00607869ULL, 0xa795ed5de313934aULL, 0x439f3304475f57b9ULL, 0xea49a581649e21c5ULL, 0xd618bb2fdf6c4ee3ULL, 0xbf80e3912043771eULL,
+ 0xc53e34d6e36302d3ULL, 0xc94af8c727af9cb2ULL, 0x49787e9a1c09994dULL, 0xafde91d5410cb26fULL, 0xac614cbf5d6b06aeULL, 0x3e464b36388bc318ULL, 0x9080f2675a067edeULL, 0xaf4e04a9be178ea9ULL,
+ 0x2f377aa147b0e418ULL, 0xed2064521a174484ULL, 0x72936f2d4ff62adcULL, 0x43f339803d017c5cULL, 0x33cff18323163a2aULL, 0x3bb05ac8418f6e33ULL, 0x51035d9e476519bbULL, 0xd15d722ecda31e8cULL,
+ 0x4fae1bdc7eb8cdfULL, 0xa1440d4806a79780ULL, 0xdfa599a52d594cdULL, 0x771881558c3cbaa0ULL, 0x140bc6c58a1e12baULL, 0x859a64e6c2830d6aULL, 0xef3467e99491682cULL, 0xcd6a8a023c2ab895ULL,
+ 0xfd47341fa23e20a9ULL, 0x2ba1b0b444a5891aULL, 0xf9e68142cdd8c6fcULL, 0x2ce9057475c0d746ULL, 0x890a1ed52640aa47ULL, 0xb78b03a5cfe65dc5ULL, 0xe067ea1ff8210382ULL, 0x838f003fcd2a1f50ULL,
+ 0x6a8bb7cea877cac8ULL, 0xd64e59c7004e6637ULL, 0x2eab0ec1ffedfe0ULL, 0x93dfb4b813e53385ULL, 0xe99aeddbb9eb2993ULL, 0x9818f9fc27e8a566ULL, 0x13f0e8644a1d18baULL, 0x6e2941a6e5226cefULL,
+ 0x3948892ded10b15fULL, 0xe54fe9e00a4becf5ULL, 0x9a1185415a95d382ULL, 0x2c7a308c29fc22c8ULL, 0xfb98d821ceb56fabULL, 0xefea73b2abc5831cULL, 0x753df3e54a5b8be5ULL, 0xe93eaf969145b046ULL,
+ 0x2d3170615efaf3e1ULL, 0xe7d74345894f5157ULL, 0x19cf2f9d0d675990ULL, 0xf74e14aea20f5b88ULL, 0xb357e1a9adbc3777ULL, 0x253a890dd4873456ULL, 0x296fa2b06771e0eeULL, 0xcbcaa00449c10fe3ULL,
+ 0xc71ac07895390996ULL, 0x30a52318c2075515ULL, 0xb0ca328311bd3c3bULL, 0x261d42a48ac6bda7ULL, 0xdbace7c06e2fb517ULL, 0xf70364d09f39c4b1ULL, 0xb18d0b825a994984ULL, 0x6a7d92e47be62b3ULL,
+ 0x83f5d2b02707e8a6ULL, 0x5a92aedb78915c40ULL, 0xe5594532dd41937eULL, 0x376c9856f744db4aULL, 0xdb176d7af2c7291fULL, 0xfad3f6c1c08e2eb7ULL, 0xc9930e07bdd6d803ULL, 0xdec4e61beab6c289ULL,
+ 0xb17d481cdd92800eULL, 0x52fd5cb29359127cULL, 0x384f48f112d95875ULL, 0x5cd8fdaffa538621ULL, 0x4cd0fbbd7349c3a4ULL, 0x2fdb9aedefbf478dULL, 0xa4fb65df90526f98ULL, 0x1adbb20b62c08065ULL,
+ 0xa611b08eea66a51ULL, 0x54020ee8ddd57a16ULL, 0xa063d4a71cf2bb22ULL, 0x6e0f4fcc0cf0d374ULL, 0x87f6a54a5dd48904ULL, 0xe9c35a42de7396ffULL, 0xb23daabf1acfa877ULL, 0xdb3b55d95d8eb953ULL,
+ 0xf183a5ad7b70bbe2ULL, 0x6ba0e50ef7fedd2cULL, 0xe454f6f62caea49ULL, 0x4654d3f09f6eb045ULL, 0xc87b30f374e5f85dULL, 0x74b8ffad46a23f27ULL, 0x1b2ea0287a587406ULL, 0x3f1f6201641a9688ULL,
+ 0x402ec6449d13bbfeULL, 0x78ebeed1bc656419ULL, 0x12868ef0d3100c0cULL, 0x487183c6951109ddULL, 0x34ae673107abac81ULL, 0x7125ea87d9bfaf6fULL, 0xca5639e1b9885f83ULL, 0xc36579cb07146f5fULL,
+ 0x185887cc9ce0b663ULL, 0x45bfaecb0cd91540ULL, 0x4001f9a2953e390dULL, 0xe99017b5b94658bcULL, 0xb14fb571efae03eeULL, 0xff2cf81d985752ddULL, 0x1cd94b4a9f4318efULL, 0x711d158b06bd3322ULL,
+ 0xc74b5ae212c7e27aULL, 0xad53aa3b4e5791f9ULL, 0xe59ae047b7f00dd2ULL, 0x78d78c7d9bbf337cULL, 0xcc40a0199c8e1825ULL, 0x7ca4041846458764ULL, 0x6542f49005c3be4eULL, 0x7048237fbd36c3f9ULL,
+ 0x50f2911f0392af68ULL, 0x9a52e8f99892c8a2ULL, 0x598d299a6d09e1b6ULL, 0xbb203135af5c87e2ULL, 0x205b9975e8064669ULL, 0x869b21ed2d16f83fULL, 0x3cd9ecc318b2bf34ULL, 0xcea45956925bf314ULL,
+ 0x7a11cfaedccab8e6ULL, 0x72572c06b2970e8cULL, 0xe12bdadc742bbaeULL, 0x9462c708eae1f47fULL, 0xf38849e3799ee589ULL, 0xeae43cadc612caacULL, 0xcecd2e95f8d64ed3ULL, 0xaef83394d8e82173ULL,
+ 0x84fac72cef5c2ea6ULL, 0x477650975b9ec1ccULL, 0xd4c6c4233a7f4566ULL, 0xaa897370a485b874ULL, 0xee20921fb09be9a0ULL, 0x8c207f4d9ff1a47ULL, 0x56640dd90da7068cULL, 0xc6e2681f4078663dULL,
+ 0x365a2d1c6b345550ULL, 0xa81cd61dda4efd75ULL, 0x6f9ce9580ca4def0ULL, 0x6d9f8a53bc7277f8ULL, 0xc70baf2296601006ULL, 0xe264fb43b45d1e58ULL, 0xc2eb98ef42d29b8ULL, 0xc2d38f184d819cadULL,
+ 0x5a16bebd4a0512beULL, 0xe139ce0bbb8745e6ULL, 0xca547d3e7790e95cULL, 0x13fbb2693593c629ULL, 0x5267dae7f1319212ULL, 0xdaadff07d56832d8ULL, 0x5fe6374c544e1e2dULL, 0x73a0ca1cb60fade1ULL,
+ 0x4163b3b1965b92c8ULL, 0xcbba1a0d49c36901ULL, 0x4913e0216e9ba425ULL, 0x71b1eb2adfa5e32ULL, 0xac5afb1f5299bcb0ULL, 0xfb0614bbf6b258f4ULL, 0x9c01adf4daa32efbULL, 0x1da7164f557f57f7ULL,
+ 0xddf037c20e4a2727ULL, 0x5470f67e22614f52ULL, 0x1a8b324fd87b2364ULL, 0xa87a810fcc4996c0ULL, 0xde8f255f972cfef5ULL, 0x76ac33eb37d1cfe7ULL, 0x2c06fe5b5920a626ULL, 0xca9be990b572734eULL,
+ 0xac2f0121e87e9ebbULL, 0x5f8d1fa40a2a41faULL, 0x851e3ad06585d2e5ULL, 0x21aadeea4d26f430ULL, 0xe052330f5b5bf122ULL, 0x13c8864288d60ce3ULL, 0x908c8b859589d255ULL, 0x3b16698323e46f4aULL,
+ 0x8b365e991dbc7351ULL, 0xabf540210a29158fULL, 0xc02d9e569cbaa2c0ULL, 0x6220b87e915d04e2ULL, 0xa1740d6b255fa5f9ULL, 0xeb1e7d558bd82d6eULL, 0xa60db5a85b41c3b6ULL, 0x832153ae271404c7ULL,
+ 0xebeb9a92eff1fb3eULL, 0x2834dceeafb53565ULL, 0x16a090fd16155e23ULL, 0x446ab84d51a1c6c3ULL, 0x2c18287b55ba824bULL, 0x9a8f01ddb541349cULL, 0x3c57f0e5b8ea7615ULL, 0x7bc77a95210d39e4ULL,
+ 0xb3644701e799092eULL, 0x3a989e9d607bf2b7ULL, 0x8fac5b8a67fab219ULL, 0x48bc18b0bfa7af75ULL, 0x5efc98b1438edae7ULL, 0x2715c2131584911aULL, 0x827d75e927f9e42cULL, 0xa523d51551d4181dULL,
+ 0x966d3e197c11840dULL, 0xbb1536625ea53629ULL, 0x56bcf141df888316ULL, 0x2d07290380aaf9dbULL, 0x21876f5eed76b306ULL, 0xea0713cb78f929e7ULL, 0xdd40bb58fb69a207ULL, 0x1e9c975df9152bfULL,
+ 0x9cd8682340db3e80ULL, 0xef03662bdf466feaULL, 0xcc7a9271d3c73f0dULL, 0x79af7c4fe899db27ULL, 0x9aea0d47de3940abULL, 0x19550274ef36d448ULL, 0x9886257e923169ceULL, 0x6f5eb64efcd14b7bULL,
+ 0x69d472d5e89ff5faULL, 0x5cdd4d2e882a3d59ULL, 0xbb26002688da155eULL, 0xc94a0fd35edccfa6ULL, 0x35d937a8994320dULL, 0xf3d5259f1dbebce5ULL, 0x6fb55a40b05d73a1ULL, 0x22852c6e5c6c3bcdULL,
+ 0x680d338ae2ba24cbULL, 0xf51fe1221377ab3bULL, 0x153e9fd2d6a52fe1ULL, 0xf534c99bb8c6b55dULL, 0x1051686ccba7525eULL, 0xb05d7cf1a6a131ddULL, 0xf71f38841a2ab9b3ULL, 0x54afe5e5d41c3391ULL,
+ 0x7b084d60ce9e25cULL, 0x25f7139314b122dfULL, 0xc532b9f65c50f98cULL, 0x7dd29a24eeade3adULL, 0x105505ce793b4422ULL, 0x3570c72c6f100d6dULL, 0xedab0cb66e7a700bULL, 0xa3adfa8692bd2e92ULL,
+ 0x7d0ace7fa02bced6ULL, 0xc22dd2280b507a21ULL, 0xaaf982a9356e0d9bULL, 0xceb698d03651b024ULL, 0x1f606295490e3760ULL, 0x870b340d2b1bd5a8ULL, 0x4b9aa6db5835b5ceULL, 0xa99f9cf9cb5a9af7ULL,
+ 0x11b426050de359bbULL, 0x949a7b7096cb18a1ULL, 0x29e3624e7f867ec6ULL, 0x82520d931e2f9742ULL, 0xedb6bd0b47672783ULL, 0xcd6686b3b7f6daa0ULL, 0xbda310df55ce4a12ULL, 0x72b44b56ab6d2c40ULL,
+ 0x97a7e87f01733fa1ULL, 0x8bd977cafa23869ULL, 0x952b1c4bc803978dULL, 0xf7b2b59b99f65af7ULL, 0xafde9be422d91a3eULL, 0x22f1d4509ff526cfULL, 0x8c770cd87c1892dfULL, 0x25f803d35c166deULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL,
+ 0x11afd58e65fc8eb6ULL, 0xf44ec1c2f8cbae38ULL, 0x669c1681a21a82eULL, 0x5225e682bc165dbeULL, 0x5fa769f7165b7dddULL, 0xa5d71b9ea62a1f66ULL, 0xa06bc899e5227cfdULL, 0x96c3ce19faea47e3ULL,
+ 0x6c7c5acf25517ab2ULL, 0x1300f5297a5996a2ULL, 0x3f07c46c3b5d1c75ULL, 0xa0e1844864fb4693ULL, 0x3b9ed5fb8f8d32c4ULL, 0x702f27b08bcbd9bfULL, 0x656c9949b4fb0b9aULL, 0x162e7a80e6d61f45ULL,
+ 0x22cac5eafaeb34fULL, 0x64cc1aeec2a70f8cULL, 0xe1ad0ccdce0753acULL, 0xda216d97127dc737ULL, 0xdaa41ba3105ef594ULL, 0x336530a27a9eefd8ULL, 0xff23a54f9d40f29dULL, 0x22ad2c5d7a04eb31ULL,
+ 0x425e1c9e46b4c285ULL, 0xb7282b9828f8c2edULL, 0x5d7d1cf0bf6dec11ULL, 0x80470733953081abULL, 0x4e5420df1078712dULL, 0x239d75451399d2e3ULL, 0xc343041b57601468ULL, 0x4a5f698755cb12f7ULL,
+ 0xef6b4338b8e46c37ULL, 0xc2ec5d4d42feb0f5ULL, 0x3f2b8e7069fe06ULL, 0xa40b02e5d14cbfcdULL, 0xf9d8944b7ea2c739ULL, 0x64c18ca9aadc629eULL, 0xe845a46848908cc4ULL, 0xcec701c0b70f33c6ULL,
+ 0x92d69a8259f9717fULL, 0x3704904db40b22d2ULL, 0x431b6f64120a9e51ULL, 0x8ee5241c55b025e2ULL, 0xd80b4e718c3134b4ULL, 0x4cf98464cf989c23ULL, 0x38c6311037889d45ULL, 0x896628b037d9ea83ULL,
+ 0xd14a2fdd913d2469ULL, 0xb7ad834af3651eccULL, 0xffb30bbd583f68a0ULL, 0x93a59bbeaaef0530ULL, 0xf64dcac97d82f952ULL, 0x398f8b44bdd04d4eULL, 0x52e00041a7d51c49ULL, 0x1dbb12da2bdd03d1ULL,
+ 0x3265c3a995c7c4fcULL, 0x3c0bca65386351a5ULL, 0x529dbfb6862a0c2ULL, 0xbaa9ed334bd2d0ecULL, 0xc83eae8a931227f3ULL, 0x864f225b5f6a250cULL, 0xd6a77e4dd0ddd88fULL, 0x133954708864c103ULL,
+ 0xdb7cdb2aad2dce2dULL, 0x1d082dffae8bc8d7ULL, 0x4f3918c40ca56c24ULL, 0xde9dad5591908e95ULL, 0xac45fcceedd21e0cULL, 0x94a30ac861139bd2ULL, 0x24d4685660a4ee41ULL, 0xa5ae8fd3c05d175bULL,
+ 0x233357c6ef6e5a67ULL, 0x378129696b079a01ULL, 0x53b4c1d74ee0e81fULL, 0xd61cb0c4930779f1ULL, 0x4a44893dec9cbeeaULL, 0x2e01a3aff4fbda4ULL, 0x989936b81a115b94ULL, 0x4bf2627fc7aa4e12ULL,
+ 0x13de77fba152e9b5ULL, 0x5571f73b734641b8ULL, 0xd3800865236ebcb7ULL, 0x19c83daa78ce4db2ULL, 0x7ac68acfec78b9aULL, 0xbe778791de6c4d59ULL, 0xf440434ed732781fULL, 0xc0c8af4fde0167e0ULL,
+ 0x4d3bc7fd3644091cULL, 0x424ec2fba0ff5b5dULL, 0xfe86162e81c5d6dfULL, 0x4e9020a93332f3dfULL, 0x7f7cdbba7006ba49ULL, 0xf4c6f64dd714906dULL, 0x3bce01d1ed1b3a9bULL, 0xb7a3294a826af4e8ULL,
+ 0xa2ef269b61e64d2dULL, 0x3bdda9b39f18905bULL, 0x14497513584be6d1ULL, 0x9b43a43fcd26c10ULL, 0x1a45561c211f8086ULL, 0xb4de718bacb43874ULL, 0x560ebacb38068d23ULL, 0x1be84ff2214a2cb0ULL,
+ 0xd3e49dd54acbc495ULL, 0xd9a8e02d3779c704ULL, 0xf0f47e5277c3d5f1ULL, 0x79079e15a3e7297ULL, 0xcef9df55c6ad171aULL, 0x70c3612840defc27ULL, 0xfcda2664d4595778ULL, 0xa3414ae2a706caaULL,
+ 0x55517c441d45e17bULL, 0x7c1a153f2740c5b9ULL, 0x1a86f24f64032745ULL, 0x25894ef53d52a93bULL, 0x2c7f538b80ed86a4ULL, 0x4bcc587c5c446de0ULL, 0xea006dce84bc3044ULL, 0x1ac94d1ea8bcdeb1ULL,
+ 0x350aea346682830cULL, 0xa833d3dea4e864cULL, 0xebcd6500ecc57bc9ULL, 0xa7c9887ceba0f7afULL, 0x3e929cf16040a867ULL, 0xbb01f1757c683276ULL, 0x9a0d682f66f8c749ULL, 0xd8fa2406302a0fb9ULL,
+ 0x2b8f9d7ffb388bc8ULL, 0xcd3daae7d78fd673ULL, 0x5482083f24806bbULL, 0x7c58d8be291279d6ULL, 0x5b31170cc146b859ULL, 0x8bcc4ac3c035d677ULL, 0xedac5410846039a7ULL, 0x9f37aa2eb9bf8179ULL,
+ 0x5fec6b1a6cbb6143ULL, 0xb5e560e514d63ca5ULL, 0x7fa3c0cc5ff395c6ULL, 0xc6a578f4d29a5e71ULL, 0x7f9cde3b5f9bb21ULL, 0xab9d1c2952becf82ULL, 0xc2d344dc8b2abe1ULL, 0xccd57ef3ae450964ULL,
+ 0xd20c287119e6fa61ULL, 0xd03be12af933f543ULL, 0x38cf981498b555dfULL, 0x8221ef1c789006ffULL, 0x6cf40157ec4e9281ULL, 0x84559ea36966aaddULL, 0xf609157a9730ab79ULL, 0x97256333427ca199ULL,
+ 0x4aba992eb47877a9ULL, 0x8e77a6070f382e22ULL, 0xbf099c9708c42ae9ULL, 0x408e8e3fb6d68fa1ULL, 0x5004b5ec270f3eebULL, 0x176b94ba28798ac3ULL, 0xbb8592f5db50920cULL, 0x6e70cf1699090040ULL,
+ 0x14a748f942a25628ULL, 0xc585c0adecb0170ULL, 0xcaf0f1d6f81f3c74ULL, 0x42bca277ff5938daULL, 0x2f5cfb4079168fd0ULL, 0xa226147329cce746ULL, 0x1ac756f64950e2d2ULL, 0x3e1976d7a7b8c86ULL,
+ 0xa6c31aa4f3f26392ULL, 0x8d7e083724a01eeeULL, 0x8e346c2ee69e57e6ULL, 0xff0ec8b87e9cf87aULL, 0x7faa06433f8fcfa5ULL, 0x263880bda98845e9ULL, 0x94f720e87a4ad1a1ULL, 0xd60fbbf279cbbbf6ULL,
+ 0x568d2cc4f65cce1ULL, 0x77466d0a4e94ab62ULL, 0x44c0aaa3cb1afb03ULL, 0x9c1f53307b2d54ecULL, 0x7452858fd7f0aaeaULL, 0x59bb702dc75ab33aULL, 0xee322869cfc7917bULL, 0x3befd08cb12f5b8bULL,
+ 0x4bc2d8b4b98102a6ULL, 0x700fe4527cf97d65ULL, 0x23494b341acc709fULL, 0x950f77a7c5b4a5e0ULL, 0x6da0a27947072115ULL, 0x323eb2d9f7043e82ULL, 0x5a09becfb885b639ULL, 0xb8e7e2ea467a0d4bULL,
+ 0x7d85fca21bb45562ULL, 0x56c523f7dbe2bULL, 0x6ccf757ecd40d0d1ULL, 0xd366730c68ab40aaULL, 0xb271ca8d2b57473cULL, 0xae5e7a2153b1ddfdULL, 0x434c371a7bcc6a6eULL, 0x28d38f2acb398401ULL,
+ 0x7e5b26fe1bf59d9fULL, 0x9ca0ffdb970f8cfeULL, 0x4332c65d5f06be51ULL, 0xca37a4030e20c566ULL, 0x601107c50eda4481ULL, 0x55614d0d43c634f0ULL, 0x1a33a6f6e0442ed5ULL, 0xc53b8468c7dff42eULL,
+ 0x43be13c06d788067ULL, 0xe3112a7575fd1fULL, 0x83ad8441aa8f6cd2ULL, 0x45acbe88e7098861ULL, 0xf4b94dea84e6de3aULL, 0xe37622e4de8882b6ULL, 0x5813d8e43f91a90eULL, 0xd34eecbaf0001f50ULL,
+ 0xbae8a09cb3b328ccULL, 0xbce887a3b3ec583dULL, 0x3d921fad5d885aeaULL, 0xd518f167182e437fULL, 0xad58252d1a83ee88ULL, 0x61abf256ec11c1f4ULL, 0x10ba6043638373fdULL, 0x8fb1448135fd364cULL,
+ 0x6fed63846fa6f112ULL, 0xb790c7b6ef436b30ULL, 0xb26c0038935a6266ULL, 0x17a1b1773e17b33bULL, 0x2bf372bf3de0437cULL, 0xd5e932e4eec76d71ULL, 0x40750ffc54f21204ULL, 0x3ea8677d3a3539caULL,
+ 0x88fd9c288ae2250bULL, 0x3fb541395c951d3fULL, 0x474c1dbb739e7563ULL, 0x85610bfda842611dULL, 0xf042ba6e4dab236cULL, 0xa94e9df5f4065fdfULL, 0x3a54f7ef242473daULL, 0xb5d17d8f9137cfbbULL,
+ 0x5fe55ce46608da99ULL, 0x437ac292738b3426ULL, 0xe482a7bfc58310c5ULL, 0xf35e4606006ec23bULL, 0x99a8e0970b55d520ULL, 0x183588f857f59138ULL, 0xa0ee057b3fb120c8ULL, 0x3cf918f50679ca1bULL,
+ 0xb425dc88b308ab62ULL, 0xc01f2c55ce05ba50ULL, 0x7f1259e512f301e1ULL, 0x88442ea9a0df3b43ULL, 0x91eebee6a8be8052ULL, 0x649f88f0d0546614ULL, 0xaa9c47a750015c8dULL, 0x90c908e176de019bULL,
+ 0x7206800d13d36637ULL, 0x175dc3cd4339bedeULL, 0x7f6066ea0d2fb7bbULL, 0x1cf0e759a5a48190ULL, 0xa19c1c34c97f31f3ULL, 0x3d7ec2e7f893df1bULL, 0xa344909677f86065ULL, 0xb0b49030ae2930e3ULL,
+ 0x396c7d0cce14b85dULL, 0xd0dec7aebec2e831ULL, 0xb6f11252f6651ad2ULL, 0x59541ca7ccdd525ULL, 0xc9ef702d96b5371dULL, 0xd2fee636b2dea96eULL, 0xb2305ba1bfff9085ULL, 0xcf5c40ab2182db21ULL,
+ 0x19c4ac2b350f7e2cULL, 0xea15ec913eadbbcbULL, 0x6cae47db8ec2419dULL, 0xca1e466a6504282cULL, 0xad9cf1e6ec570e6aULL, 0x3063a2512655f283ULL, 0x4981273522080a6aULL, 0xdcfa22159bc523ffULL,
+ 0x143932091a63e064ULL, 0xdde82f6c67b34e41ULL, 0x642edad88a95cba2ULL, 0x49b40e014d28b12ULL, 0x87284dc19e1a7743ULL, 0x62d3f326090aa23ULL, 0x4274b71b9b8800b6ULL, 0x1d4ab4dda2835cc2ULL,
+ 0xd794a2dcac28acf1ULL, 0xa6bdf6ca885c9654ULL, 0x9daa28beadf565daULL, 0xf026512f3b8ad113ULL, 0xfb1a3cfba80e724aULL, 0x6a7b9dec20af6c7ULL, 0xa8ec9d5d1298710cULL, 0x2b200300b2db3585ULL,
+ 0xcae3733e74192c08ULL, 0x1dcb57ca00ebb86ULL, 0x7877243e41f00e1bULL, 0x9d005dcd1e408f04ULL, 0x92f2d2e8d79ad65cULL, 0xc5ce2558c47fd042ULL, 0x504218747e2c3075ULL, 0xa43803dbd8823b6fULL,
+ 0x71bc924eec3dc976ULL, 0x75e54322efb67fefULL, 0x6b421234f593a0a9ULL, 0x8ba8241808f89078ULL, 0x16d7f9c0a1fb1ed1ULL, 0xf00b960e50cedeb5ULL, 0x942a9ebdf828014cULL, 0x99a48056df7765eULL,
+ 0x8dc26c4a2dcf798dULL, 0x4f787df34aa91b45ULL, 0x615646e010420d89ULL, 0x65c60bde69e47d9ULL, 0x9f704f6f384da286ULL, 0xdd7ec7297dbdbb31ULL, 0x1987cfb1506cd4a1ULL, 0x967001aac9c0e620ULL,
+ 0x509f5c73d2bf304dULL, 0x7ff9ab63d3a40f20ULL, 0x483d65b1dee4dc3dULL, 0xbaef6a9deb069b14ULL, 0xee80d5e602fb2382ULL, 0x146203fb2843544dULL, 0xcd6b49c6c4147ddcULL, 0x2458991c262c8622ULL,
+ 0x63f8010fe68cbefbULL, 0xa69c2c9922a34e59ULL, 0xc14d505c816e5fdaULL, 0xf4b58a9e3e70810fULL, 0xe4e3dfb503fbfb47ULL, 0xa826ff060ee70124ULL, 0xdfa40e8d0a1ec318ULL, 0x5ea048d45024c881ULL,
+ 0x9835b955e7a085abULL, 0x712d1501260c863dULL, 0xf31e47df5a820f28ULL, 0xc7afcd6677f5e308ULL, 0x32e94393f240c438ULL, 0x9fd14c3e5dcdda0eULL, 0x84d309d19bbf0ea9ULL, 0xf64e5c9fc121accfULL,
+ 0x928c1d1b6d7ae8d7ULL, 0x68e5ca0a4a75bbd0ULL, 0x7b06ca0ed3f847b8ULL, 0xa19e549e850806ffULL, 0xcd49623a578fb9d8ULL, 0x87fe1cadcf182eb3ULL, 0x8ee9015c2a0cea87ULL, 0xfbad7c7c78b39f47ULL,
+ 0x44385b0896dff79eULL, 0xd5232112d0d71baeULL, 0xa7dc493455e8df4eULL, 0x308dc7d4d4cbaf9cULL, 0xb19909efa4b01871ULL, 0xf1965fba761b5ae2ULL, 0x21d3b0eb217fa0caULL, 0xaf828dd54cf1c2c7ULL,
+ 0x1e4dfa1725c7331dULL, 0xad3266c214116feULL, 0x3851ecceeddac03cULL, 0x166cc5bacadf9d45ULL, 0x984cfc468e19a57eULL, 0xd81dca658db0db70ULL, 0x85b9e15e14e0bd61ULL, 0x85885c66707eebeeULL,
+ 0x9ac6f7ed398a012fULL, 0xd776d31614c9c941ULL, 0x84c159d95be9a04aULL, 0xfc471da67fe5a3a8ULL, 0x98640a2ec47addaeULL, 0x1cb74cf55b568450ULL, 0xd5443fd82732b264ULL, 0xbe0354229a9107fdULL,
+ 0x3e177e9657d898a7ULL, 0xb8b643728a1c54b1ULL, 0xf5ac097ff001a87eULL, 0x70f4e3de20da4441ULL, 0x150465ee9c1ac7fULL, 0x8fc05ac7033a8f96ULL, 0x6adceb1b028de0bfULL, 0x427db327a6a1dccdULL,
+ 0x293ff4998be06edeULL, 0x8735d4d7f210ecf0ULL, 0x440aeba551e7a27dULL, 0xa4d3eb0b99639eacULL, 0xb79a9726b35aa4c4ULL, 0x3b55383389cb373cULL, 0x464c61c811dee768ULL, 0xbae4680899d0e996ULL,
+ 0xefe474f47e02595aULL, 0x340e1d549f7e7e9aULL, 0x6dd21b1ce7624e19ULL, 0x7dc5d93dd090c93dULL, 0x46c18052c237a2cfULL, 0x257ac3a8d09cfbc6ULL, 0x9adb06646e2a33caULL, 0x218c12c78a9d67fULL,
+ 0xb5ab9c95e42e5931ULL, 0x999801d6d946d87ULL, 0xd55c1c9b576ada22ULL, 0x8166adc27a631719ULL, 0x9040d46ed73c111aULL, 0xe54aa69d9d3b7a6dULL, 0x14ff922b65390c9bULL, 0x52fa114e947c624bULL,
+ 0x6ca3b79c4b887f56ULL, 0x98aa392cd8a0b2d9ULL, 0x58e3ecdc59bd58d0ULL, 0x67039b433c427202ULL, 0xfe330c9ad062687dULL, 0x66a848c3523c89a8ULL, 0x70ed13ddc9954250ULL, 0xdca2381b9b2483bfULL,
+ 0x8d40925dc31b41e8ULL, 0xb2f4b5e772f66936ULL, 0x711c68e1baa3cf8eULL, 0xd350f826474eb32ULL, 0xa43966749b371caeULL, 0xcff01dd3e769101eULL, 0xa57cfae72a6bf360ULL, 0x88461f6bb3119fa2ULL,
+ 0xda1c9605df7e2280ULL, 0x6333efd59214016aULL, 0x49a2ce5498d80f5bULL, 0x3b667d896fe2ae1aULL, 0xd673630fcd710b25ULL, 0x8d4a4680cb3fcb1dULL, 0x39257b69408a4fe5ULL, 0xa79fcab8d9a78046ULL,
+ 0x2c72265b50eebe3bULL, 0x25b99fae24ebedbULL, 0xb5dd126dbcfa80cdULL, 0x9d7494f859a4de09ULL, 0xdfb9bc75d09222a3ULL, 0xe627429105d9ca86ULL, 0x349fc6451fda2140ULL, 0xc22aae3c42669e19ULL,
+ 0x3f11558bc104947bULL, 0x93563bebedc8fa6fULL, 0x32ad8f6330b22b1bULL, 0xe1021998365db12aULL, 0x692a0df788cdb929ULL, 0xa78cacd012197f7bULL, 0x40898492605d5b61ULL, 0x7019f6f23d8d3f46ULL,
+ 0xff76d3302128387fULL, 0x8c4a231ef89ac4b7ULL, 0xac87f611b9fced81ULL, 0xfef005d1f1a46ee0ULL, 0x5a7c3b92c1ce7ddeULL, 0x3fb7a833fa52cc0bULL, 0xefcf1aeb635316c3ULL, 0x5578b267bc8515c5ULL,
+ 0xec8b2b02b0d16684ULL, 0x747f55a95d9ab553ULL, 0xd1edb24b64556b6aULL, 0x4b85ae0bc8dc1767ULL, 0x76948839fc32a5d4ULL, 0x3b27ad64d12f866ULL, 0x21d9b3cd44f63183ULL, 0xd11e5480ec8c8ffcULL,
+ 0x4e1261908161415dULL, 0x337ecd5d6fcab634ULL, 0x656cd5cbac0adb2cULL, 0x42c6781938d7d8e0ULL, 0xd380035459abd274ULL, 0xfa1f072ca4bfbc50ULL, 0x73a4cb7331f11eeeULL, 0xe09f9e9617d5fb56ULL,
+ 0x732776c910531d5bULL, 0x165eee90874b65e8ULL, 0xc279438d9b519dcfULL, 0x163b9ab1a580cbbdULL, 0x3848860a5244956fULL, 0x3aaa418dd9b69f68ULL, 0x222ad38115cb9111ULL, 0x12c5df9f6ec2f292ULL,
+ 0x2d7e42d6867cfb46ULL, 0x6c77bbd2fe97c60eULL, 0xb6de1c4c2f5d752bULL, 0xbbd6002df67700adULL, 0xafa38b09300678c6ULL, 0x3ec4b700aff50805ULL, 0xba9ccc3ecf915f6aULL, 0x4b986607c0ba4a5eULL,
+ 0xa64c38bd14467facULL, 0x23d4dd45f927efc0ULL, 0xc1c83918f4584ff0ULL, 0x263cdd4a777646baULL, 0x75e881db42ba717cULL, 0xb0beb9277c9d165cULL, 0x473b2022f3602827ULL, 0xbbc0059e8d4eb837ULL,
+ 0x1aecebfc31179629ULL, 0x43b9e92d20bb5d08ULL, 0x459b5af8b16f68d3ULL, 0x6f46d5fb193f0430ULL, 0x8d99658856f50e8fULL, 0x7dd58b482f049b25ULL, 0xeea15784ca66cdefULL, 0x12f7a590403c434eULL,
+ 0x414804656f1d8805ULL, 0xdde361143bd562f1ULL, 0x5e38430774241ba0ULL, 0xef2c92fec03614faULL, 0x95b5b7a5f95d56e0ULL, 0x5f3fb3dd876dac3ULL, 0x1f501a89e7c24aaeULL, 0x49e36e951d7055c9ULL,
+ 0xf40a6e5577ed8740ULL, 0xfa8487102aa61771ULL, 0xb859d69c7b64eb45ULL, 0x32840466be4d4205ULL, 0x2a6868538c501866ULL, 0x3c9f7e3381336eeeULL, 0xc3945d635b84473ULL, 0xc57b6a676f69bd10ULL,
+ 0xbea31eb3d146e999ULL, 0x2c55145fe5d5b368ULL, 0x7358a9230dbdb4f1ULL, 0x5370963b3a69ea6fULL, 0x4ff24f255c2357c6ULL, 0x8005df809a1c735dULL, 0xe2e476995d0c4218ULL, 0x8ceab2409dd743fULL,
+ 0xe030cf788e79884ULL, 0xe38f2cba540b2ca5ULL, 0xf5ee7e448bcf7a07ULL, 0x1b27efedc946008cULL, 0xbaecbea798535407ULL, 0xc75f3d8cdd942862ULL, 0x54953be783fee7a2ULL, 0x16b027e9b38a871dULL,
+ 0xcfce46c1db0a2210ULL, 0x25b234af4df867ecULL, 0xf95fdb88f49c6e6bULL, 0xf87ef7b89358433fULL, 0xd4d4a6a4007de5bcULL, 0x11f7279e8cf0851dULL, 0xb344a447c843aac6ULL, 0x870b03ea74b3b805ULL,
+ 0xb412442a4be832b4ULL, 0x55f7dabacf8593c1ULL, 0x8d8e059ead674b73ULL, 0x59d8a6845d011cfeULL, 0x125dfb01c5e4a7acULL, 0x31f410536c400edbULL, 0xab9c134b30ec1941ULL, 0x99341faedaddcf65ULL,
+ 0xab6e4e65e0ee50e6ULL, 0x9fce4c35df04c0c7ULL, 0x9afc7c8c4d57e46dULL, 0xd85ad040bb51946aULL, 0xa6211d2786709ef7ULL, 0x8d9d96a82ae66044ULL, 0x54a47aa4848e0f95ULL, 0x57bdd2b2ed0d294dULL,
+ 0x8891148f09246f2bULL, 0x2dd2a929a863a15eULL, 0x397efce805cd115eULL, 0x260ca3cabf993347ULL, 0x8ada24fd03ae787fULL, 0x14c30cdb506ff6cdULL, 0x2cd3d7b6bc251f47ULL, 0x468c450125a565d3ULL,
+ 0xc3fffa045cc2edc7ULL, 0x6c6eb373984d9345ULL, 0x6eb364d10813aa3cULL, 0x2165c31df80a63acULL, 0x65dc222bb6ce99bdULL, 0x777aa71dbca38b9bULL, 0x3f51248b2f375522ULL, 0x481078697fc6514ULL,
+ 0xca36c8f4ac9cb8e1ULL, 0x3a2bae801268052dULL, 0x2ec35ee29e11b6e6ULL, 0x9863addb43fc0878ULL, 0x7fe7c32be7c9501aULL, 0x1f3564c39209ff2cULL, 0x8e4087d4898a1ffdULL, 0x56d36fb956978a01ULL,
+ 0x3f5195f3b2ed1bf3ULL, 0x5225e0eeb53f001bULL, 0xaa90a96ba12e5fc9ULL, 0xdd4d1dab3182834ULL, 0x5a0f79186f61c366ULL, 0x923a1870a21d1f29ULL, 0x3fb0abc9138ffcd0ULL, 0x44753fb05857e7baULL,
+ 0xe5de9aedaf823909ULL, 0x629660d28f2e68f1ULL, 0x5dde7456000516b4ULL, 0x845f62dc5fc3fa4fULL, 0x4273cd933be4df40ULL, 0xb12532bb016182e4ULL, 0x5620ef75806cf5b6ULL, 0x2f4aa635ed19db39ULL,
+ 0x5416a132cb4144d5ULL, 0x6917de7d83845305ULL, 0x6e8d73f860592955ULL, 0x94f5cc6b9b9ee7eaULL, 0x416b2ef8212b3259ULL, 0x3d7283142c7381acULL, 0xa53789e8eb3325faULL, 0x7cb6ff78dcece7c8ULL,
+ 0x36a962f6e5f22626ULL, 0xe4f437b526c131e4ULL, 0x10a9c12706cb71f7ULL, 0x6a80ac5e05fc1587ULL, 0x217a79b68221d382ULL, 0x8447f35c687d75b5ULL, 0x1d251920d5483ab7ULL, 0x760c26340075b82ULL,
+ 0x9ac09d6319348563ULL, 0x59e3511693349c94ULL, 0x698669d8513d6cf8ULL, 0xd9aa80213542d9c2ULL, 0xfb8b386049f09a48ULL, 0xfac605e55ffc923aULL, 0x87f678a0c9dafbbULL, 0xbe50fe6427ec1547ULL,
+ 0x9407bb24305afd59ULL, 0x6c42a3c1d5b5f855ULL, 0x94e6f16a30731decULL, 0x7856be260967846bULL, 0xb1029b21a8871931ULL, 0x71afbb6217dfafbbULL, 0xf48a465a72ed7e1bULL, 0x68e2becf244a99eeULL,
+ 0x6d812a0edee4b333ULL, 0xb33bf5099e6ff946ULL, 0x9035ed8f5765c091ULL, 0x4fcab2d3bdaa0130ULL, 0xbe40575913ea7c09ULL, 0x6d08b745b4b86ee7ULL, 0x53c3f506a5944845ULL, 0x6628944e1d64a7aULL,
+ 0x56a4b835ae00b18aULL, 0x3d3e285687635463ULL, 0xafd32a7a90276f8fULL, 0x713454b505ad3019ULL, 0x5fad233660734f0aULL, 0xdcf49088de4d26c8ULL, 0x61a06ac6699478f0ULL, 0x14b59524d6308078ULL,
+ 0x38c938549a7b2663ULL, 0x362d19b3e749c931ULL, 0x2df3d4403a9ac73dULL, 0xb4c33947dfde630ULL, 0xe01bb199c392de3aULL, 0x4b367a2da4ad57d5ULL, 0x292533c279a644fdULL, 0x3f4230b451b5c7e7ULL,
+ 0x25320cfe5fc86fc4ULL, 0x10820623f1f75be7ULL, 0xaf1259c1e8b896ULL, 0x92f0b256d940fdbULL, 0xf39d919832ab0ce7ULL, 0x3194f627f45f3d33ULL, 0x4ad4be81b0a82b58ULL, 0xa7ab8d3d76823404ULL,
+ 0x9114bbcdca4a05fcULL, 0xec00048ce3abdedaULL, 0xfaae89996d3a6e87ULL, 0xff8099ad4cde996dULL, 0x32f13b748586a3c2ULL, 0xf3fc8d664de01096ULL, 0x12423d618031281ULL, 0xf1ab42f62bb2ab4ULL,
+ 0x7c841a27993ce25aULL, 0x62daf827e704bc24ULL, 0x666bf22fb7568748ULL, 0x7c035cf9a0a1007ULL, 0x628e786946343198ULL, 0x8709dcfee9cfd16cULL, 0xb85fa35e961bc9a2ULL, 0xff52431ff07904d2ULL,
+ 0xe8515ba8f7ed723eULL, 0x7b65aa1e66f8fed0ULL, 0x5b83492252f616f8ULL, 0x8b15b80599df8d50ULL, 0x724ec4d54840fc1bULL, 0x2334bff60e49b26fULL, 0xbb287411c3e47558ULL, 0xd315f747220e8799ULL,
+ 0x8a1d75858a361b6bULL, 0x7f39581c485ea4dcULL, 0x6db6446e25415888ULL, 0xa7d29bf71f2a1afdULL, 0x1a10eb15921d95cbULL, 0x7db43342f3ef5173ULL, 0xd9590b950cf22c4dULL, 0xa1adea34552c99a2ULL,
+ 0x513654e7a69b5f5dULL, 0x98eea7b5858aa423ULL, 0xf64d8e8b911b9441ULL, 0xed346903967c764bULL, 0xcf48853153f90520ULL, 0xc00166d6253933bbULL, 0x285b3f7d45931b68ULL, 0x5b27f74cb283c9d0ULL,
+ 0x5830e43ddfa86fecULL, 0xe0413db11c28734bULL, 0xfa1a30bbf2136f6bULL, 0x23c8644d5f665b38ULL, 0x3bb7924699e1c7eULL, 0x613c22feafab4197ULL, 0xa0887cd2aeb6948ULL, 0xca0648439437d25dULL,
+ 0x46efe764871f99beULL, 0x9e87b9a9916d1412ULL, 0x16e67d0b122fe8dcULL, 0x15e192cec9dfad0dULL, 0x9837a6bfd4cdfa0ULL, 0xd140f34a2fdca1c2ULL, 0xff53935d66c07fd7ULL, 0xbb544246b6c466bfULL,
+ 0xdd26fddb0fd333e9ULL, 0xc41815a3f3098b83ULL, 0xab904c251ee7c938ULL, 0xb99f72d51174bd95ULL, 0x753b2a7fc5913b27ULL, 0xb549249c7c3fa0daULL, 0x4fad655f9a453603ULL, 0x707011d3cbd22284ULL,
+ 0xefc0572540107943ULL, 0x40bff9ec1aa08f05ULL, 0x26f15fb704a2d836ULL, 0x9f0e36bcf340253fULL, 0xb2f73b30686d95e3ULL, 0xc02a118d2a3ec616ULL, 0xb00bfc94dd8f8e7bULL, 0x85eef11b33624b0fULL,
+ 0x780a77cb65c5b63eULL, 0xdd6e5d42704238aaULL, 0xe4fa4a20d7b9515ULL, 0x44df5a2bb8f0e76fULL, 0xaab1ff30d9084106ULL, 0xe675ea708d748a45ULL, 0x559256dffb224b3fULL, 0xf0ae5d79e6558951ULL,
+ 0xb2854f0cf4c724bfULL, 0x73d1b95c178833ffULL, 0x1ecdd3936f22b2e6ULL, 0x20e21fe7a01b0215ULL, 0x2724f509521d26e9ULL, 0xb26a670d6d7d8ce8ULL, 0x509714ebc2db4c51ULL, 0x46f134381bf1ee6ULL,
+ 0xce65ce5e93700279ULL, 0x748c4b1edd1c4397ULL, 0x1512e9fe8991d792ULL, 0xbb5c7475de84b64fULL, 0x3b6852837b291328ULL, 0xc9ad3052b7a44b78ULL, 0xf34789feaa0af83cULL, 0x4ffa8fcb7a981be4ULL,
+ 0x4e5eecf78505028bULL, 0xd352a7341cb05091ULL, 0x4ee92bf0f705c97dULL, 0x8b2a5d2da8a8aeefULL, 0x514c2469ee5a38e4ULL, 0x6e67143e672b0d8ULL, 0x40f2f42b168cfc34ULL, 0x65aaef8409718e20ULL,
+ 0xab1c203e5889edadULL, 0x8f0e18b879badfe5ULL, 0xe8abe40492734b89ULL, 0xb0f77f268f69471bULL, 0x3237c8cd0b906663ULL, 0x8166aa68e8e19d55ULL, 0x6b125b41375f758aULL, 0xc058a662b14f8e72ULL,
+ 0x2faa788892d50c6fULL, 0xf96873a0d1238bf5ULL, 0x7a1de5fbf141cb46ULL, 0x557cae42965494fdULL, 0x3818f6e516edaf0aULL, 0x5dafaed9d2fcdd27ULL, 0x19b29e9b9628b624ULL, 0x839b00afac70d8e1ULL,
+ 0xc1d9217f8f73030dULL, 0x2bba088356b1b411ULL, 0xf3734a79dc86eff2ULL, 0xbbaef71558deaa29ULL, 0x705cd3f4339a3aabULL, 0x6cb9be9171cc6c55ULL, 0x3b22e3bcabbe3991ULL, 0x234ffdc8a6802f76ULL,
+ 0xe7a8e6df2248fc40ULL, 0xb2654586ef769f70ULL, 0xdd4d3a2a1381b5d0ULL, 0x579d7f710f906ea6ULL, 0xc75096f3f89d7e31ULL, 0xf09362431cc05dcaULL, 0xf1e46800dd4d072ULL, 0x3c0ad45fdf1823d7ULL,
+ 0x8577092e774b1786ULL, 0xb5ae8d09da0a752cULL, 0x3ae6afb4fb983c5dULL, 0x6701dddd2e93a6ULL, 0x9ee31e6fe354e548ULL, 0xb86f2787e53b3718ULL, 0x2f20be87500ffcacULL, 0x7900bd66011751e2ULL,
+ 0x20f1749ecd028dd2ULL, 0xd67726fa16fc8092ULL, 0x45b5de2d0f3ed86dULL, 0xcc4ecde44d65351fULL, 0x3d9cea839d10a435ULL, 0xab39c0ce4bb32c52ULL, 0x8d82fae6126d0482ULL, 0xc51f1e613460dfd5ULL,
+ 0x21838be97ecb328cULL, 0xc46836b853a66265ULL, 0xb1611bc44484b943ULL, 0x1efb0c85e8049f4eULL, 0xe3ff76b3d68ed1e4ULL, 0x630a9c43536bed8eULL, 0xcbfb63183c74dcabULL, 0xcbd8e69009902bdbULL,
+ 0x3443e50b4a1f4b70ULL, 0x597580e420949f1cULL, 0xb7dec05c1bf77016ULL, 0x121a51bb972b429fULL, 0xe504c9a11b46c0a3ULL, 0xe85bf568eface8c2ULL, 0xf7e26a7b5f20ad21ULL, 0x105ac363e5da58a6ULL,
+ 0xd906ae31d8829042ULL, 0xacd05fbc10cd29a4ULL, 0xf86e3c6fd4547f02ULL, 0xf654067dc4e8cbecULL, 0xccc7f7eebb15b9b8ULL, 0xbcc7e4df00e2dbbbULL, 0x68889e9eddf6352eULL, 0xbef4c6abeda2aee9ULL,
+ 0xb014683a366507c7ULL, 0x6d0546964bc9f367ULL, 0xf42544a91846058fULL, 0x2484bfc7e96207caULL, 0x9a90e742303fed95ULL, 0xe698f91f3d93dda8ULL, 0x9b101a7100cec17aULL, 0x5991494a49ed5c0ULL,
+ 0xd8c6c475cc591563ULL, 0xf3c136ade6ba21f0ULL, 0xdde8f6104e4c8cfaULL, 0x953a41709d72aee1ULL, 0xc6694d11a8367b58ULL, 0x39d603a17d5b2813ULL, 0x66ededab2f9378b0ULL, 0xf49e439156a9633ULL,
+ 0x2ac63319e096c047ULL, 0x30ab0b6b5f587d6aULL, 0xd9fd87fc175dd003ULL, 0xc0cdf64d07d9deabULL, 0xc77a5585107bfaafULL, 0x8db8bccdefa9815eULL, 0x7d4cb2a351903a37ULL, 0x643827480758b3c9ULL,
+ 0x63fd7c6c7854e5e9ULL, 0x11b774b27ae86481ULL, 0x9fb68c7960ef92f5ULL, 0x52886d983ad9d1aeULL, 0x70b7b1b10210018dULL, 0xdebadd57520e6eb8ULL, 0xb8341b20685e9703ULL, 0xe10159ae2ea2f94dULL,
+ 0x957eda6062ebd320ULL, 0xc944e3a4135f83aaULL, 0x70f30918d1bb7357ULL, 0x2b62b6c502cf4bb3ULL, 0xeb912f352c2413f8ULL, 0x72dd09caaa902c59ULL, 0x8403349f467c48bcULL, 0xc7dc0cba7a0a7762ULL,
+ 0x4ee7bc1ea592a1ULL, 0x837b833961d596ccULL, 0x53214b4283c2ad0dULL, 0x54e7fd1ed14951feULL, 0xc87fca7c8b076983ULL, 0x5cd77700a8c61d6cULL, 0xc431bc277d802effULL, 0x6ad8ba7b787fcc44ULL,
+ 0x551a9bd7541f5c3cULL, 0xe281a02a1dd2de3aULL, 0x854072dfb6d22ad3ULL, 0x697e681755209c27ULL, 0xe79f9e11cd3b4659ULL, 0x4dbfe204b9281652ULL, 0xdc51e37cfb5b1a49ULL, 0xc0acd5bd68a67f1aULL,
+ 0xe1810696548e8ea0ULL, 0x2a83204783dd1527ULL, 0xa73c9b1ba9635170ULL, 0x8bb4fb3a852c1639ULL, 0x43e0f0c78e0c4c4cULL, 0x10e5738d2787d3abULL, 0xf08322044eec9bb8ULL, 0xdffcaf3581deb448ULL,
+ 0x567915fa4f257b7dULL, 0xf256da751348db2cULL, 0x1d07fcc52e2b22a1ULL, 0xb3f6375dd88596f6ULL, 0xca8ce6a0d513bf00ULL, 0xf315bd30e9e8c2f8ULL, 0x52fbd34230314d8fULL, 0x2666ee570d93ae2eULL,
+ 0x3189ed3aab440815ULL, 0xc7c44ecce877dd50ULL, 0x8162e03f38581febULL, 0xfee06c31b22b54d2ULL, 0x1dc557255613cb3dULL, 0x871b10061820ce81ULL, 0x940a8dea904351a5ULL, 0xc6ae0999e4ebfdfaULL,
+ 0xe9ef182d5ac9434aULL, 0xfd76634dd30ba65dULL, 0x7f0009458147dd7cULL, 0xef57d4fc36df3703ULL, 0x79938c297bbc3c42ULL, 0xe990469bf8fcb421ULL, 0x1b5fc389619f7d7dULL, 0x4a2c88f7c6f54216ULL,
+ 0xd2e7dfdbcdbc7d2eULL, 0xad42d2beb9ed8202ULL, 0x9a1c7b885e56c837ULL, 0x831331cb6f4d8005ULL, 0xc629d32d7316ee88ULL, 0x9cb1f03545df0c0dULL, 0xed3bd4385b0bbc23ULL, 0xaae9c72dd30530e9ULL,
+ 0x108ae5c0c2a136c9ULL, 0x97086bf1abef9c81ULL, 0x780fac4b7f543170ULL, 0x6b93564b12818ab9ULL, 0x36ef6db82bd5cd9cULL, 0x10285fbe23d5bcb7ULL, 0xcec32ccf43093275ULL, 0x611d843d603d1e20ULL,
+ 0x2d15c9da8f7947b9ULL, 0x8f9ed5e56fdc169bULL, 0xf45924fa88d9e959ULL, 0xffdf0f04f6fd97bdULL, 0x80ff36e55f7e0bULL, 0xc4cc85723495751eULL, 0xbe23f0b33417db82ULL, 0xe0bece25fb3b6dddULL,
+ 0xbd5fe17a9c5ba7b6ULL, 0xf9bd2741588c5384ULL, 0x125592387f4b9de1ULL, 0x4686bd9353ddff52ULL, 0x96ee08205eb1fe78ULL, 0xf4013eddcf2a53aULL, 0x6434c188747f9632ULL, 0x21659ee1e547033fULL,
+ 0x6cb14a214cf9fa3ULL, 0x70c1cf6b05380a24ULL, 0xff53c901e4ea160eULL, 0xb3e9cd67dc249b0eULL, 0x516b9ea005caf88bULL, 0xfb674bc5463d5024ULL, 0x8516d5ee1f0406b3ULL, 0x4068aff64559ccaaULL,
+ 0xc399815f3b5c3035ULL, 0xbc109d0dfcd2c04ULL, 0xcdc76ba72a6400f0ULL, 0x367bb3a7d9131730ULL, 0xdcc575db01df0a1bULL, 0x4b0dabde7869b90aULL, 0xc7812b9738a94b6aULL, 0x75f80bb0aac750a9ULL,
+ 0x3fa5cc892d9ba2a8ULL, 0x6948afb9eae078e1ULL, 0xfcd5eb03d4afed6fULL, 0x5972444472306bf3ULL, 0x1bedce818d14fc3ULL, 0xe0c7f6dea8125395ULL, 0xee95847afe9f6b4dULL, 0xb9ed33eaee8970fcULL,
+ 0x6487dc882616d02eULL, 0x2ee18b10aa383a03ULL, 0xef2382e99cd67757ULL, 0x1ca247cbd893a5ceULL, 0x93e5a97dd0f51c0fULL, 0x10963b29291457c6ULL, 0xfc00028384d95963ULL, 0xa4a0f57125629824ULL,
+ 0xb703300d64576766ULL, 0x67410bfd5181a4cULL, 0x5fc773b92420fe12ULL, 0x727d3ce0b5ead2a0ULL, 0xacd3fa811bf74d0bULL, 0x156f4edd46e41f2eULL, 0xeafaf8a81ea4e459ULL, 0x8839029d6a532c13ULL,
+ 0x985a33a6204a4502ULL, 0x8b918c4eda502eb1ULL, 0x8026596480a17e66ULL, 0x173aeb7d9492eafbULL, 0xfa5a5e9bebf08ccdULL, 0xf3fa901e1514341bULL, 0x58450d397274c4deULL, 0x11e797e33d7994ddULL,
+};
+#endif
diff --git a/lib/nettle/gost/ecc-gost512a.c b/lib/nettle/gost/ecc-gost512a.c
new file mode 100644
index 0000000000..5a4c7e99b6
--- /dev/null
+++ b/lib/nettle/gost/ecc-gost512a.c
@@ -0,0 +1,132 @@
+/* ecc-gost512a.c
+
+ Compile time constant (but machine dependent) tables.
+
+ Copyright (C) 2013, 2014 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include <nettle/ecc.h>
+#include "ecc-internal.h"
+#include "ecc-gost-curve.h"
+
+#define USE_REDC (ECC_REDC_SIZE != 0)
+
+#if GMP_NUMB_BITS == 32
+#include "ecc-gost512a-32.h"
+#elif GMP_NUMB_BITS == 64
+#include "ecc-gost512a-64.h"
+#else
+#error unsupported configuration
+#endif
+
+#if ECC_REDC_SIZE > 0
+# define ecc_512_redc ecc_pp1_redc
+#elif ECC_REDC_SIZE == 0
+# define ecc_512_redc NULL
+#else
+# error Configuration error
+#endif
+
+#define ecc_512_modp ecc_mod
+#define ecc_512_modq ecc_mod
+
+static const struct ecc_curve _gnutls_gost_512a =
+{
+ {
+ 512,
+ ECC_LIMB_SIZE,
+ ECC_BMODP_SIZE,
+ ECC_REDC_SIZE,
+ ECC_MOD_INV_ITCH (ECC_LIMB_SIZE),
+ 0,
+
+ ecc_p,
+ ecc_Bmodp,
+ ecc_Bmodp_shifted,
+ ecc_redc_ppm1,
+
+ ecc_pp1h,
+ ecc_512_modp,
+ USE_REDC ? ecc_512_redc : ecc_512_modp,
+ ecc_mod_inv,
+ NULL,
+ },
+ {
+ 512,
+ ECC_LIMB_SIZE,
+ ECC_BMODQ_SIZE,
+ 0,
+ ECC_MOD_INV_ITCH (ECC_LIMB_SIZE),
+ 0,
+
+ ecc_q,
+ ecc_Bmodq,
+ ecc_Bmodq_shifted,
+ NULL,
+ ecc_qp1h,
+
+ ecc_512_modq,
+ ecc_512_modq,
+ ecc_mod_inv,
+ NULL,
+ },
+
+ USE_REDC,
+ ECC_PIPPENGER_K,
+ ECC_PIPPENGER_C,
+
+ ECC_ADD_JJJ_ITCH (ECC_LIMB_SIZE),
+ ECC_MUL_A_ITCH (ECC_LIMB_SIZE),
+ ECC_MUL_G_ITCH (ECC_LIMB_SIZE),
+ ECC_J_TO_A_ITCH (ECC_LIMB_SIZE),
+
+ ecc_add_jjj,
+ ecc_mul_a,
+ ecc_mul_g,
+ ecc_j_to_a,
+
+ ecc_b,
+ ecc_g,
+ NULL,
+ ecc_unit,
+ ecc_table
+};
+
+const struct ecc_curve *nettle_get_gost_512a(void)
+{
+ return &_gnutls_gost_512a;
+}
diff --git a/lib/nettle/gost/ecc-gostdsa-sign.c b/lib/nettle/gost/ecc-gostdsa-sign.c
new file mode 100644
index 0000000000..7dbe06cb30
--- /dev/null
+++ b/lib/nettle/gost/ecc-gostdsa-sign.c
@@ -0,0 +1,104 @@
+/* ecc-gostdsa-sign.c
+
+ Copyright (C) 2015 Dmitry Eremin-Solenikov
+ Copyright (C) 2013, 2014 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include <stdlib.h>
+
+#include "gostdsa.h"
+#include "ecc-internal.h"
+
+/* Low-level GOST DSA signing */
+
+mp_size_t
+ecc_gostdsa_sign_itch (const struct ecc_curve *ecc)
+{
+ /* Needs 3*ecc->p.size + scratch for ecc->mul_g. Currently same for
+ ecc_mul_g and ecc_mul_g_eh. */
+ return ECC_GOSTDSA_SIGN_ITCH (ecc->p.size);
+}
+
+/* NOTE: Caller should check if r or s is zero. */
+void
+ecc_gostdsa_sign (const struct ecc_curve *ecc,
+ const mp_limb_t *zp,
+ const mp_limb_t *kp,
+ size_t length, const uint8_t *digest,
+ mp_limb_t *rp, mp_limb_t *sp,
+ mp_limb_t *scratch)
+{
+#define P scratch
+#define hp (scratch + 4*ecc->p.size)
+#define tp (scratch + 2*ecc->p.size)
+#define t2p scratch
+ /* Procedure, according to GOST 34.10. q denotes the group
+ order.
+
+ 1. k <-- uniformly random, 0 < k < q
+
+ 2. C <-- (c_x, c_y) = k g
+
+ 3. r <-- c_x mod q
+
+ 4. s <-- (r*z + k*h) mod q.
+ */
+
+ ecc->mul_g (ecc, P, kp, P + 3*ecc->p.size);
+ /* x coordinate only, modulo q */
+ ecc->h_to_a (ecc, 2, rp, P, P + 3*ecc->p.size);
+
+ /* Process hash digest */
+ gost_hash (&ecc->q, hp, length, digest);
+ if (mpn_zero_p (hp, ecc->p.size))
+ mpn_add_1 (hp, hp, ecc->p.size, 1);
+
+ ecc_modq_mul (ecc, tp, rp, zp);
+ ecc_modq_mul (ecc, t2p, kp, hp);
+ ecc_modq_add (ecc, sp, tp, t2p);
+
+ /* Also reduce mod ecc->q. It should already be < 2*ecc->q,
+ * so one subtraction should suffice. */
+
+ *scratch = mpn_sub_n (tp, sp, ecc->q.m, ecc->p.size);
+ cnd_copy (*scratch == 0, sp, tp, ecc->p.size);
+
+#undef P
+#undef hp
+#undef tp
+#undef t2p
+}
diff --git a/lib/nettle/gost/ecc-gostdsa-verify.c b/lib/nettle/gost/ecc-gostdsa-verify.c
new file mode 100644
index 0000000000..0e1e0afe5a
--- /dev/null
+++ b/lib/nettle/gost/ecc-gostdsa-verify.c
@@ -0,0 +1,133 @@
+/* ecc-gostdsa-verify.c
+
+ Copyright (C) 2015 Dmitry Eremin-Solenikov
+ Copyright (C) 2013, 2014 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include <stdlib.h>
+
+#include "gostdsa.h"
+#include "ecc-internal.h"
+
+/* Low-level GOST DSA verify */
+
+static int
+ecdsa_in_range (const struct ecc_curve *ecc, const mp_limb_t *xp)
+{
+ return !mpn_zero_p (xp, ecc->p.size)
+ && mpn_cmp (xp, ecc->q.m, ecc->p.size) < 0;
+}
+
+mp_size_t
+ecc_gostdsa_verify_itch (const struct ecc_curve *ecc)
+{
+ /* Largest storage need is for the ecc->mul call. */
+ return 5*ecc->p.size + ecc->mul_itch;
+}
+
+/* FIXME: Use faster primitives, not requiring side-channel silence. */
+int
+ecc_gostdsa_verify (const struct ecc_curve *ecc,
+ const mp_limb_t *pp, /* Public key */
+ size_t length, const uint8_t *digest,
+ const mp_limb_t *rp, const mp_limb_t *sp,
+ mp_limb_t *scratch)
+{
+ /* Procedure, according to GOST R 34.10. q denotes the group
+ order.
+
+ 1. Check 0 < r, s < q.
+
+ 2. v <-- h^{-1} (mod q)
+
+ 3. z1 <-- s * v (mod q)
+
+ 4. z2 <-- -r * v (mod q)
+
+ 5. R = u1 G + u2 Y
+
+ 6. Signature is valid if R_x = r (mod q).
+ */
+
+#define hp (scratch)
+#define vp (scratch + ecc->p.size)
+#define z1 (scratch + 3*ecc->p.size)
+#define z2 (scratch + 4*ecc->p.size)
+
+#define P1 (scratch + 4*ecc->p.size)
+#define P2 (scratch)
+
+
+ if (! (ecdsa_in_range (ecc, rp)
+ && ecdsa_in_range (ecc, sp)))
+ return 0;
+
+ gost_hash (&ecc->q, hp, length, digest);
+
+ if (mpn_zero_p (hp, ecc->p.size))
+ mpn_add_1 (hp, hp, ecc->p.size, 1);
+
+ /* Compute v */
+ ecc->q.invert (&ecc->q, vp, hp, vp + 2*ecc->p.size);
+
+ /* z1 = s / h, P1 = z1 * G */
+ ecc_modq_mul (ecc, z1, sp, vp);
+
+ /* z2 = - r / h, P2 = z2 * Y */
+ ecc_modq_mul (ecc, z2, rp, vp);
+ mpn_sub_n (z2, ecc->q.m, z2, ecc->p.size);
+
+ /* Total storage: 5*ecc->p.size + ecc->mul_itch */
+ ecc->mul (ecc, P2, z2, pp, z2 + ecc->p.size);
+
+ /* Total storage: 7*ecc->p.size + ecc->mul_g_itch (ecc->p.size) */
+ ecc->mul_g (ecc, P1, z1, P1 + 3*ecc->p.size);
+
+ /* Total storage: 6*ecc->p.size + ecc->add_hhh_itch */
+ ecc->add_hhh (ecc, P1, P1, P2, P1 + 3*ecc->p.size);
+
+ /* x coordinate only, modulo q */
+ ecc->h_to_a (ecc, 2, P2, P1, P1 + 3*ecc->p.size);
+
+ return (mpn_cmp (rp, P2, ecc->p.size) == 0);
+#undef P2
+#undef P1
+#undef z2
+#undef z1
+#undef hp
+#undef vp
+}
diff --git a/lib/nettle/gost/ecc-internal.h b/lib/nettle/gost/ecc-internal.h
new file mode 100644
index 0000000000..16d6828772
--- /dev/null
+++ b/lib/nettle/gost/ecc-internal.h
@@ -0,0 +1,253 @@
+/* ecc-internal.h
+
+ Copyright (C) 2013, 2014 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */
+
+#ifndef NETTLE_GOST_ECC_INTERNAL_H_INCLUDED
+#define NETTLE_GOST_ECC_INTERNAL_H_INCLUDED
+
+#include <nettle/nettle-types.h>
+#include <nettle/bignum.h>
+#include <nettle/ecc-curve.h>
+#include "gmp-glue.h"
+
+#define ecc_mod_add _nettle_ecc_mod_add
+#define ecc_mod_mul _nettle_ecc_mod_mul
+#define ecc_mod_random _nettle_ecc_mod_random
+#define ecc_mod _nettle_ecc_mod
+#define ecc_mod_inv _nettle_ecc_mod_inv
+#define gost_hash _gnutls_gost_hash
+#define ecc_j_to_a _nettle_ecc_j_to_a
+#define ecc_add_jjj _nettle_ecc_add_jjj
+#define ecc_mul_g _nettle_ecc_mul_g
+#define ecc_mul_a _nettle_ecc_mul_a
+#define cnd_copy _nettle_cnd_copy
+
+/* Window size for ecc_mul_a. Using 4 bits seems like a good choice,
+ for both Intel x86_64 and ARM Cortex A9. For the larger curves, of
+ 384 and 521 bits, we could improve speed by a few percent if we go
+ up to 5 bits, but I don't think that's worth doubling the
+ storage. */
+#define ECC_MUL_A_WBITS 4
+
+struct ecc_modulo;
+
+/* Reduces from 2*ecc->size to ecc->size. */
+/* Required to return a result < 2q. This property is inherited by
+ mod_mul and mod_sqr. */
+typedef void ecc_mod_func (const struct ecc_modulo *m, mp_limb_t *rp);
+
+typedef void ecc_mod_inv_func (const struct ecc_modulo *m,
+ mp_limb_t *vp, const mp_limb_t *ap,
+ mp_limb_t *scratch);
+
+/* Computes the square root of (u/v) (mod p) */
+typedef int ecc_mod_sqrt_func (const struct ecc_modulo *m,
+ mp_limb_t *rp,
+ const mp_limb_t *up, const mp_limb_t *vp,
+ mp_limb_t *scratch);
+
+typedef void ecc_add_func (const struct ecc_curve *ecc,
+ mp_limb_t *r,
+ const mp_limb_t *p, const mp_limb_t *q,
+ mp_limb_t *scratch);
+
+typedef void ecc_mul_g_func (const struct ecc_curve *ecc, mp_limb_t *r,
+ const mp_limb_t *np, mp_limb_t *scratch);
+
+typedef void ecc_mul_func (const struct ecc_curve *ecc,
+ mp_limb_t *r,
+ const mp_limb_t *np, const mp_limb_t *p,
+ mp_limb_t *scratch);
+
+typedef void ecc_h_to_a_func (const struct ecc_curve *ecc,
+ int flags,
+ mp_limb_t *r, const mp_limb_t *p,
+ mp_limb_t *scratch);
+
+struct ecc_modulo
+{
+ unsigned short bit_size;
+ unsigned short size;
+ unsigned short B_size;
+ unsigned short redc_size;
+ unsigned short invert_itch;
+ unsigned short sqrt_itch;
+
+ const mp_limb_t *m;
+ /* B^size mod m. Expected to have at least 32 leading zeros
+ (equality for secp_256r1). */
+ const mp_limb_t *B;
+ /* 2^{bit_size} - p, same value as above, but shifted. */
+ const mp_limb_t *B_shifted;
+ /* m +/- 1, for redc, excluding redc_size low limbs. */
+ const mp_limb_t *redc_mpm1;
+ /* (m+1)/2 */
+ const mp_limb_t *mp1h;
+
+ ecc_mod_func *mod;
+ ecc_mod_func *reduce;
+ ecc_mod_inv_func *invert;
+ ecc_mod_sqrt_func *sqrt;
+};
+
+/* Represents an elliptic curve of the form
+
+ y^2 = x^3 - 3x + b (mod p)
+*/
+struct ecc_curve
+{
+ /* The prime p. */
+ struct ecc_modulo p;
+ /* Group order. FIXME: Currently, many fucntions rely on q.size ==
+ p.size. This has to change for radix-51 implementation of
+ curve25519 mod p arithmetic. */
+ struct ecc_modulo q;
+
+ unsigned short use_redc;
+ unsigned short pippenger_k;
+ unsigned short pippenger_c;
+
+ unsigned short add_hhh_itch;
+ unsigned short mul_itch;
+ unsigned short mul_g_itch;
+ unsigned short h_to_a_itch;
+
+ ecc_add_func *add_hhh;
+ ecc_mul_func *mul;
+ ecc_mul_g_func *mul_g;
+ ecc_h_to_a_func *h_to_a;
+
+ /* Curve constant */
+ const mp_limb_t *b;
+ /* Generator, x coordinate followed by y (affine coordinates).
+ Currently used only by the test suite. */
+ const mp_limb_t *g;
+ /* If non-NULL, the constant needed for transformation to the
+ equivalent Edwards curve. */
+ const mp_limb_t *edwards_root;
+
+ /* For redc, same as B mod p, otherwise 1. */
+ const mp_limb_t *unit;
+
+ /* Tables for multiplying by the generator, size determined by k and
+ c. The first 2^c entries are defined by
+
+ T[ j_0 + j_1 2 + ... + j_{c-1} 2^{c-1} ]
+ = j_0 g + j_1 2^k g + ... + j_{c-1} 2^{k(c-1)} g
+
+ The following entries differ by powers of 2^{kc},
+
+ T[i] = 2^{kc} T[i-2^c]
+ */
+ const mp_limb_t *pippenger_table;
+};
+
+/* In-place reduction. */
+ecc_mod_func ecc_mod;
+
+ecc_mod_inv_func ecc_mod_inv;
+
+void
+ecc_mod_add (const struct ecc_modulo *m, mp_limb_t *rp,
+ const mp_limb_t *ap, const mp_limb_t *bp);
+
+/* NOTE: mul and sqr needs 2*ecc->size limbs at rp */
+void
+ecc_mod_mul (const struct ecc_modulo *m, mp_limb_t *rp,
+ const mp_limb_t *ap, const mp_limb_t *bp);
+
+#define ecc_modq_add(ecc, r, a, b) \
+ ecc_mod_add (&(ecc)->q, (r), (a), (b))
+#define ecc_modq_mul(ecc, r, a, b) \
+ ecc_mod_mul (&(ecc)->q, (r), (a), (b))
+
+/* mod q operations. */
+void
+ecc_mod_random (const struct ecc_modulo *m, mp_limb_t *xp,
+ void *ctx, nettle_random_func *random, mp_limb_t *scratch);
+
+void
+gost_hash (const struct ecc_modulo *m,
+ mp_limb_t *hp,
+ size_t length, const uint8_t *digest);
+
+/* Converts a point P in jacobian coordinates into a point R in affine
+ coordinates. If op == 1, produce x coordinate only. If op == 2,
+ produce the x coordiante only, and in also it modulo q. FIXME: For
+ the public interface, have separate for the three cases, and use
+ this flag argument only for the internal ecc->h_to_a function. */
+void
+ecc_j_to_a (const struct ecc_curve *ecc,
+ int op,
+ mp_limb_t *r, const mp_limb_t *p,
+ mp_limb_t *scratch);
+
+/* Point addition with Jacobian input and output. */
+void
+ecc_add_jjj (const struct ecc_curve *ecc,
+ mp_limb_t *r, const mp_limb_t *p, const mp_limb_t *q,
+ mp_limb_t *scratch);
+
+/* Computes N * the group generator. N is an array of ecc_size()
+ limbs. It must be in the range 0 < N < group order, then R != 0,
+ and the algorithm can work without any intermediate values getting
+ to zero. */
+void
+ecc_mul_g (const struct ecc_curve *ecc, mp_limb_t *r,
+ const mp_limb_t *np, mp_limb_t *scratch);
+
+/* Computes N * P. The scalar N is the same as for ecc_mul_g. P is a
+ non-zero point on the curve, in affine coordinates. Output R is a
+ non-zero point, in Jacobian coordinates. */
+void
+ecc_mul_a (const struct ecc_curve *ecc,
+ mp_limb_t *r,
+ const mp_limb_t *np, const mp_limb_t *p,
+ mp_limb_t *scratch);
+
+void
+cnd_copy (int cnd, mp_limb_t *rp, const mp_limb_t *ap, mp_size_t n);
+
+/* Current scratch needs: */
+#define ECC_MOD_INV_ITCH(size) (2*(size))
+#define ECC_J_TO_A_ITCH(size) (5*(size))
+#define ECC_ADD_JJJ_ITCH(size) (8*(size))
+#define ECC_MUL_G_ITCH(size) (9*(size))
+#if ECC_MUL_A_WBITS == 0
+#define ECC_MUL_A_ITCH(size) (12*(size))
+#else
+#define ECC_MUL_A_ITCH(size) \
+ (((3 << ECC_MUL_A_WBITS) + 11) * (size))
+#endif
+#define ECC_GOSTDSA_SIGN_ITCH(size) (12*(size))
+
+#endif /* NETTLE_GOST_ECC_INTERNAL_H_INCLUDED */
diff --git a/lib/nettle/gost/gmp-glue.h b/lib/nettle/gost/gmp-glue.h
new file mode 100644
index 0000000000..21823c3e60
--- /dev/null
+++ b/lib/nettle/gost/gmp-glue.h
@@ -0,0 +1,76 @@
+/* gmp-glue.h
+
+ Copyright (C) 2013 Niels Möller
+ Copyright (C) 2013 Red Hat
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#ifndef NETTLE_GMP_GLUE_H_INCLUDED
+#define NETTLE_GMP_GLUE_H_INCLUDED
+
+#include <nettle/bignum.h>
+
+#define mpz_limbs_copy _nettle_mpz_limbs_copy
+#define mpn_set_base256_le _nettle_mpn_set_base256_le
+#define mpn_get_base256_le _nettle_mpn_get_base256_le
+#define gmp_alloc_limbs _nettle_gmp_alloc_limbs
+#define gmp_free_limbs _nettle_gmp_free_limbs
+
+void
+mpn_set_base256_le (mp_limb_t *rp, mp_size_t rn,
+ const uint8_t *xp, size_t xn);
+
+void
+mpn_get_base256_le (uint8_t *rp, size_t rn,
+ const mp_limb_t *xp, mp_size_t xn);
+
+#ifndef mpn_zero_p
+static inline int
+mpn_zero_p (const mp_limb_t *xp, mp_size_t n)
+{
+ while (n > 0)
+ if (xp[--n] != 0)
+ return 0;
+ return 1;
+}
+#endif
+
+/* Copy limbs, with zero-padding. */
+/* FIXME: Reorder arguments, on the theory that the first argument of
+ an _mpz_* function should be an mpz_t? Or rename to _mpz_get_limbs,
+ with argument order consistent with mpz_get_*. */
+void
+mpz_limbs_copy (mp_limb_t *xp, mpz_srcptr x, mp_size_t n);
+
+mp_limb_t *
+gmp_alloc_limbs (mp_size_t n);
+
+void
+gmp_free_limbs (mp_limb_t *p, mp_size_t n);
+
+#endif /* NETTLE_GMP_GLUE_H_INCLUDED */
diff --git a/lib/nettle/gost/gost28147.c b/lib/nettle/gost/gost28147.c
new file mode 100644
index 0000000000..0b70d39ca6
--- /dev/null
+++ b/lib/nettle/gost/gost28147.c
@@ -0,0 +1,2367 @@
+/* gost28147.c - GOST 28147-89 (Magma) cipher implementation
+ *
+ * based on Russian standard GOST 28147-89
+ * For English description, check RFC 5830.
+ * S-Boxes are expanded from the tables defined in RFC4357:
+ * https://tools.ietf.org/html/rfc4357
+ *
+ * Copyright: 2015-2015 Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
+ * Copyright: 2009-2012 Aleksey Kravchenko <rhash.admin@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include <string.h>
+
+#include <nettle/macros.h>
+#include "nettle-write.h"
+#include "gost28147.h"
+#include <nettle/memxor.h>
+
+/* pre-initialized GOST lookup tables based on rotated S-Box */
+const struct gost28147_param gost28147_param_test_3411 =
+{
+ 0,
+ {
+ /* 0 */
+ 0x00072000, 0x00075000, 0x00074800, 0x00071000,
+ 0x00076800, 0x00074000, 0x00070000, 0x00077000,
+ 0x00073000, 0x00075800, 0x00070800, 0x00076000,
+ 0x00073800, 0x00077800, 0x00072800, 0x00071800,
+ 0x0005a000, 0x0005d000, 0x0005c800, 0x00059000,
+ 0x0005e800, 0x0005c000, 0x00058000, 0x0005f000,
+ 0x0005b000, 0x0005d800, 0x00058800, 0x0005e000,
+ 0x0005b800, 0x0005f800, 0x0005a800, 0x00059800,
+ 0x00022000, 0x00025000, 0x00024800, 0x00021000,
+ 0x00026800, 0x00024000, 0x00020000, 0x00027000,
+ 0x00023000, 0x00025800, 0x00020800, 0x00026000,
+ 0x00023800, 0x00027800, 0x00022800, 0x00021800,
+ 0x00062000, 0x00065000, 0x00064800, 0x00061000,
+ 0x00066800, 0x00064000, 0x00060000, 0x00067000,
+ 0x00063000, 0x00065800, 0x00060800, 0x00066000,
+ 0x00063800, 0x00067800, 0x00062800, 0x00061800,
+ 0x00032000, 0x00035000, 0x00034800, 0x00031000,
+ 0x00036800, 0x00034000, 0x00030000, 0x00037000,
+ 0x00033000, 0x00035800, 0x00030800, 0x00036000,
+ 0x00033800, 0x00037800, 0x00032800, 0x00031800,
+ 0x0006a000, 0x0006d000, 0x0006c800, 0x00069000,
+ 0x0006e800, 0x0006c000, 0x00068000, 0x0006f000,
+ 0x0006b000, 0x0006d800, 0x00068800, 0x0006e000,
+ 0x0006b800, 0x0006f800, 0x0006a800, 0x00069800,
+ 0x0007a000, 0x0007d000, 0x0007c800, 0x00079000,
+ 0x0007e800, 0x0007c000, 0x00078000, 0x0007f000,
+ 0x0007b000, 0x0007d800, 0x00078800, 0x0007e000,
+ 0x0007b800, 0x0007f800, 0x0007a800, 0x00079800,
+ 0x00052000, 0x00055000, 0x00054800, 0x00051000,
+ 0x00056800, 0x00054000, 0x00050000, 0x00057000,
+ 0x00053000, 0x00055800, 0x00050800, 0x00056000,
+ 0x00053800, 0x00057800, 0x00052800, 0x00051800,
+ 0x00012000, 0x00015000, 0x00014800, 0x00011000,
+ 0x00016800, 0x00014000, 0x00010000, 0x00017000,
+ 0x00013000, 0x00015800, 0x00010800, 0x00016000,
+ 0x00013800, 0x00017800, 0x00012800, 0x00011800,
+ 0x0001a000, 0x0001d000, 0x0001c800, 0x00019000,
+ 0x0001e800, 0x0001c000, 0x00018000, 0x0001f000,
+ 0x0001b000, 0x0001d800, 0x00018800, 0x0001e000,
+ 0x0001b800, 0x0001f800, 0x0001a800, 0x00019800,
+ 0x00042000, 0x00045000, 0x00044800, 0x00041000,
+ 0x00046800, 0x00044000, 0x00040000, 0x00047000,
+ 0x00043000, 0x00045800, 0x00040800, 0x00046000,
+ 0x00043800, 0x00047800, 0x00042800, 0x00041800,
+ 0x0000a000, 0x0000d000, 0x0000c800, 0x00009000,
+ 0x0000e800, 0x0000c000, 0x00008000, 0x0000f000,
+ 0x0000b000, 0x0000d800, 0x00008800, 0x0000e000,
+ 0x0000b800, 0x0000f800, 0x0000a800, 0x00009800,
+ 0x00002000, 0x00005000, 0x00004800, 0x00001000,
+ 0x00006800, 0x00004000, 0x00000000, 0x00007000,
+ 0x00003000, 0x00005800, 0x00000800, 0x00006000,
+ 0x00003800, 0x00007800, 0x00002800, 0x00001800,
+ 0x0003a000, 0x0003d000, 0x0003c800, 0x00039000,
+ 0x0003e800, 0x0003c000, 0x00038000, 0x0003f000,
+ 0x0003b000, 0x0003d800, 0x00038800, 0x0003e000,
+ 0x0003b800, 0x0003f800, 0x0003a800, 0x00039800,
+ 0x0002a000, 0x0002d000, 0x0002c800, 0x00029000,
+ 0x0002e800, 0x0002c000, 0x00028000, 0x0002f000,
+ 0x0002b000, 0x0002d800, 0x00028800, 0x0002e000,
+ 0x0002b800, 0x0002f800, 0x0002a800, 0x00029800,
+ 0x0004a000, 0x0004d000, 0x0004c800, 0x00049000,
+ 0x0004e800, 0x0004c000, 0x00048000, 0x0004f000,
+ 0x0004b000, 0x0004d800, 0x00048800, 0x0004e000,
+ 0x0004b800, 0x0004f800, 0x0004a800, 0x00049800,
+ /* 1 */
+ 0x03a80000, 0x03c00000, 0x03880000, 0x03e80000,
+ 0x03d00000, 0x03980000, 0x03a00000, 0x03900000,
+ 0x03f00000, 0x03f80000, 0x03e00000, 0x03b80000,
+ 0x03b00000, 0x03800000, 0x03c80000, 0x03d80000,
+ 0x06a80000, 0x06c00000, 0x06880000, 0x06e80000,
+ 0x06d00000, 0x06980000, 0x06a00000, 0x06900000,
+ 0x06f00000, 0x06f80000, 0x06e00000, 0x06b80000,
+ 0x06b00000, 0x06800000, 0x06c80000, 0x06d80000,
+ 0x05280000, 0x05400000, 0x05080000, 0x05680000,
+ 0x05500000, 0x05180000, 0x05200000, 0x05100000,
+ 0x05700000, 0x05780000, 0x05600000, 0x05380000,
+ 0x05300000, 0x05000000, 0x05480000, 0x05580000,
+ 0x00a80000, 0x00c00000, 0x00880000, 0x00e80000,
+ 0x00d00000, 0x00980000, 0x00a00000, 0x00900000,
+ 0x00f00000, 0x00f80000, 0x00e00000, 0x00b80000,
+ 0x00b00000, 0x00800000, 0x00c80000, 0x00d80000,
+ 0x00280000, 0x00400000, 0x00080000, 0x00680000,
+ 0x00500000, 0x00180000, 0x00200000, 0x00100000,
+ 0x00700000, 0x00780000, 0x00600000, 0x00380000,
+ 0x00300000, 0x00000000, 0x00480000, 0x00580000,
+ 0x04280000, 0x04400000, 0x04080000, 0x04680000,
+ 0x04500000, 0x04180000, 0x04200000, 0x04100000,
+ 0x04700000, 0x04780000, 0x04600000, 0x04380000,
+ 0x04300000, 0x04000000, 0x04480000, 0x04580000,
+ 0x04a80000, 0x04c00000, 0x04880000, 0x04e80000,
+ 0x04d00000, 0x04980000, 0x04a00000, 0x04900000,
+ 0x04f00000, 0x04f80000, 0x04e00000, 0x04b80000,
+ 0x04b00000, 0x04800000, 0x04c80000, 0x04d80000,
+ 0x07a80000, 0x07c00000, 0x07880000, 0x07e80000,
+ 0x07d00000, 0x07980000, 0x07a00000, 0x07900000,
+ 0x07f00000, 0x07f80000, 0x07e00000, 0x07b80000,
+ 0x07b00000, 0x07800000, 0x07c80000, 0x07d80000,
+ 0x07280000, 0x07400000, 0x07080000, 0x07680000,
+ 0x07500000, 0x07180000, 0x07200000, 0x07100000,
+ 0x07700000, 0x07780000, 0x07600000, 0x07380000,
+ 0x07300000, 0x07000000, 0x07480000, 0x07580000,
+ 0x02280000, 0x02400000, 0x02080000, 0x02680000,
+ 0x02500000, 0x02180000, 0x02200000, 0x02100000,
+ 0x02700000, 0x02780000, 0x02600000, 0x02380000,
+ 0x02300000, 0x02000000, 0x02480000, 0x02580000,
+ 0x03280000, 0x03400000, 0x03080000, 0x03680000,
+ 0x03500000, 0x03180000, 0x03200000, 0x03100000,
+ 0x03700000, 0x03780000, 0x03600000, 0x03380000,
+ 0x03300000, 0x03000000, 0x03480000, 0x03580000,
+ 0x06280000, 0x06400000, 0x06080000, 0x06680000,
+ 0x06500000, 0x06180000, 0x06200000, 0x06100000,
+ 0x06700000, 0x06780000, 0x06600000, 0x06380000,
+ 0x06300000, 0x06000000, 0x06480000, 0x06580000,
+ 0x05a80000, 0x05c00000, 0x05880000, 0x05e80000,
+ 0x05d00000, 0x05980000, 0x05a00000, 0x05900000,
+ 0x05f00000, 0x05f80000, 0x05e00000, 0x05b80000,
+ 0x05b00000, 0x05800000, 0x05c80000, 0x05d80000,
+ 0x01280000, 0x01400000, 0x01080000, 0x01680000,
+ 0x01500000, 0x01180000, 0x01200000, 0x01100000,
+ 0x01700000, 0x01780000, 0x01600000, 0x01380000,
+ 0x01300000, 0x01000000, 0x01480000, 0x01580000,
+ 0x02a80000, 0x02c00000, 0x02880000, 0x02e80000,
+ 0x02d00000, 0x02980000, 0x02a00000, 0x02900000,
+ 0x02f00000, 0x02f80000, 0x02e00000, 0x02b80000,
+ 0x02b00000, 0x02800000, 0x02c80000, 0x02d80000,
+ 0x01a80000, 0x01c00000, 0x01880000, 0x01e80000,
+ 0x01d00000, 0x01980000, 0x01a00000, 0x01900000,
+ 0x01f00000, 0x01f80000, 0x01e00000, 0x01b80000,
+ 0x01b00000, 0x01800000, 0x01c80000, 0x01d80000,
+ /* 2 */
+ 0x30000002, 0x60000002, 0x38000002, 0x08000002,
+ 0x28000002, 0x78000002, 0x68000002, 0x40000002,
+ 0x20000002, 0x50000002, 0x48000002, 0x70000002,
+ 0x00000002, 0x18000002, 0x58000002, 0x10000002,
+ 0xb0000005, 0xe0000005, 0xb8000005, 0x88000005,
+ 0xa8000005, 0xf8000005, 0xe8000005, 0xc0000005,
+ 0xa0000005, 0xd0000005, 0xc8000005, 0xf0000005,
+ 0x80000005, 0x98000005, 0xd8000005, 0x90000005,
+ 0x30000005, 0x60000005, 0x38000005, 0x08000005,
+ 0x28000005, 0x78000005, 0x68000005, 0x40000005,
+ 0x20000005, 0x50000005, 0x48000005, 0x70000005,
+ 0x00000005, 0x18000005, 0x58000005, 0x10000005,
+ 0x30000000, 0x60000000, 0x38000000, 0x08000000,
+ 0x28000000, 0x78000000, 0x68000000, 0x40000000,
+ 0x20000000, 0x50000000, 0x48000000, 0x70000000,
+ 0x00000000, 0x18000000, 0x58000000, 0x10000000,
+ 0xb0000003, 0xe0000003, 0xb8000003, 0x88000003,
+ 0xa8000003, 0xf8000003, 0xe8000003, 0xc0000003,
+ 0xa0000003, 0xd0000003, 0xc8000003, 0xf0000003,
+ 0x80000003, 0x98000003, 0xd8000003, 0x90000003,
+ 0x30000001, 0x60000001, 0x38000001, 0x08000001,
+ 0x28000001, 0x78000001, 0x68000001, 0x40000001,
+ 0x20000001, 0x50000001, 0x48000001, 0x70000001,
+ 0x00000001, 0x18000001, 0x58000001, 0x10000001,
+ 0xb0000000, 0xe0000000, 0xb8000000, 0x88000000,
+ 0xa8000000, 0xf8000000, 0xe8000000, 0xc0000000,
+ 0xa0000000, 0xd0000000, 0xc8000000, 0xf0000000,
+ 0x80000000, 0x98000000, 0xd8000000, 0x90000000,
+ 0xb0000006, 0xe0000006, 0xb8000006, 0x88000006,
+ 0xa8000006, 0xf8000006, 0xe8000006, 0xc0000006,
+ 0xa0000006, 0xd0000006, 0xc8000006, 0xf0000006,
+ 0x80000006, 0x98000006, 0xd8000006, 0x90000006,
+ 0xb0000001, 0xe0000001, 0xb8000001, 0x88000001,
+ 0xa8000001, 0xf8000001, 0xe8000001, 0xc0000001,
+ 0xa0000001, 0xd0000001, 0xc8000001, 0xf0000001,
+ 0x80000001, 0x98000001, 0xd8000001, 0x90000001,
+ 0x30000003, 0x60000003, 0x38000003, 0x08000003,
+ 0x28000003, 0x78000003, 0x68000003, 0x40000003,
+ 0x20000003, 0x50000003, 0x48000003, 0x70000003,
+ 0x00000003, 0x18000003, 0x58000003, 0x10000003,
+ 0x30000004, 0x60000004, 0x38000004, 0x08000004,
+ 0x28000004, 0x78000004, 0x68000004, 0x40000004,
+ 0x20000004, 0x50000004, 0x48000004, 0x70000004,
+ 0x00000004, 0x18000004, 0x58000004, 0x10000004,
+ 0xb0000002, 0xe0000002, 0xb8000002, 0x88000002,
+ 0xa8000002, 0xf8000002, 0xe8000002, 0xc0000002,
+ 0xa0000002, 0xd0000002, 0xc8000002, 0xf0000002,
+ 0x80000002, 0x98000002, 0xd8000002, 0x90000002,
+ 0xb0000004, 0xe0000004, 0xb8000004, 0x88000004,
+ 0xa8000004, 0xf8000004, 0xe8000004, 0xc0000004,
+ 0xa0000004, 0xd0000004, 0xc8000004, 0xf0000004,
+ 0x80000004, 0x98000004, 0xd8000004, 0x90000004,
+ 0x30000006, 0x60000006, 0x38000006, 0x08000006,
+ 0x28000006, 0x78000006, 0x68000006, 0x40000006,
+ 0x20000006, 0x50000006, 0x48000006, 0x70000006,
+ 0x00000006, 0x18000006, 0x58000006, 0x10000006,
+ 0xb0000007, 0xe0000007, 0xb8000007, 0x88000007,
+ 0xa8000007, 0xf8000007, 0xe8000007, 0xc0000007,
+ 0xa0000007, 0xd0000007, 0xc8000007, 0xf0000007,
+ 0x80000007, 0x98000007, 0xd8000007, 0x90000007,
+ 0x30000007, 0x60000007, 0x38000007, 0x08000007,
+ 0x28000007, 0x78000007, 0x68000007, 0x40000007,
+ 0x20000007, 0x50000007, 0x48000007, 0x70000007,
+ 0x00000007, 0x18000007, 0x58000007, 0x10000007,
+ /* 3 */
+ 0x000000e8, 0x000000d8, 0x000000a0, 0x00000088,
+ 0x00000098, 0x000000f8, 0x000000a8, 0x000000c8,
+ 0x00000080, 0x000000d0, 0x000000f0, 0x000000b8,
+ 0x000000b0, 0x000000c0, 0x00000090, 0x000000e0,
+ 0x000007e8, 0x000007d8, 0x000007a0, 0x00000788,
+ 0x00000798, 0x000007f8, 0x000007a8, 0x000007c8,
+ 0x00000780, 0x000007d0, 0x000007f0, 0x000007b8,
+ 0x000007b0, 0x000007c0, 0x00000790, 0x000007e0,
+ 0x000006e8, 0x000006d8, 0x000006a0, 0x00000688,
+ 0x00000698, 0x000006f8, 0x000006a8, 0x000006c8,
+ 0x00000680, 0x000006d0, 0x000006f0, 0x000006b8,
+ 0x000006b0, 0x000006c0, 0x00000690, 0x000006e0,
+ 0x00000068, 0x00000058, 0x00000020, 0x00000008,
+ 0x00000018, 0x00000078, 0x00000028, 0x00000048,
+ 0x00000000, 0x00000050, 0x00000070, 0x00000038,
+ 0x00000030, 0x00000040, 0x00000010, 0x00000060,
+ 0x000002e8, 0x000002d8, 0x000002a0, 0x00000288,
+ 0x00000298, 0x000002f8, 0x000002a8, 0x000002c8,
+ 0x00000280, 0x000002d0, 0x000002f0, 0x000002b8,
+ 0x000002b0, 0x000002c0, 0x00000290, 0x000002e0,
+ 0x000003e8, 0x000003d8, 0x000003a0, 0x00000388,
+ 0x00000398, 0x000003f8, 0x000003a8, 0x000003c8,
+ 0x00000380, 0x000003d0, 0x000003f0, 0x000003b8,
+ 0x000003b0, 0x000003c0, 0x00000390, 0x000003e0,
+ 0x00000568, 0x00000558, 0x00000520, 0x00000508,
+ 0x00000518, 0x00000578, 0x00000528, 0x00000548,
+ 0x00000500, 0x00000550, 0x00000570, 0x00000538,
+ 0x00000530, 0x00000540, 0x00000510, 0x00000560,
+ 0x00000268, 0x00000258, 0x00000220, 0x00000208,
+ 0x00000218, 0x00000278, 0x00000228, 0x00000248,
+ 0x00000200, 0x00000250, 0x00000270, 0x00000238,
+ 0x00000230, 0x00000240, 0x00000210, 0x00000260,
+ 0x000004e8, 0x000004d8, 0x000004a0, 0x00000488,
+ 0x00000498, 0x000004f8, 0x000004a8, 0x000004c8,
+ 0x00000480, 0x000004d0, 0x000004f0, 0x000004b8,
+ 0x000004b0, 0x000004c0, 0x00000490, 0x000004e0,
+ 0x00000168, 0x00000158, 0x00000120, 0x00000108,
+ 0x00000118, 0x00000178, 0x00000128, 0x00000148,
+ 0x00000100, 0x00000150, 0x00000170, 0x00000138,
+ 0x00000130, 0x00000140, 0x00000110, 0x00000160,
+ 0x000001e8, 0x000001d8, 0x000001a0, 0x00000188,
+ 0x00000198, 0x000001f8, 0x000001a8, 0x000001c8,
+ 0x00000180, 0x000001d0, 0x000001f0, 0x000001b8,
+ 0x000001b0, 0x000001c0, 0x00000190, 0x000001e0,
+ 0x00000768, 0x00000758, 0x00000720, 0x00000708,
+ 0x00000718, 0x00000778, 0x00000728, 0x00000748,
+ 0x00000700, 0x00000750, 0x00000770, 0x00000738,
+ 0x00000730, 0x00000740, 0x00000710, 0x00000760,
+ 0x00000368, 0x00000358, 0x00000320, 0x00000308,
+ 0x00000318, 0x00000378, 0x00000328, 0x00000348,
+ 0x00000300, 0x00000350, 0x00000370, 0x00000338,
+ 0x00000330, 0x00000340, 0x00000310, 0x00000360,
+ 0x000005e8, 0x000005d8, 0x000005a0, 0x00000588,
+ 0x00000598, 0x000005f8, 0x000005a8, 0x000005c8,
+ 0x00000580, 0x000005d0, 0x000005f0, 0x000005b8,
+ 0x000005b0, 0x000005c0, 0x00000590, 0x000005e0,
+ 0x00000468, 0x00000458, 0x00000420, 0x00000408,
+ 0x00000418, 0x00000478, 0x00000428, 0x00000448,
+ 0x00000400, 0x00000450, 0x00000470, 0x00000438,
+ 0x00000430, 0x00000440, 0x00000410, 0x00000460,
+ 0x00000668, 0x00000658, 0x00000620, 0x00000608,
+ 0x00000618, 0x00000678, 0x00000628, 0x00000648,
+ 0x00000600, 0x00000650, 0x00000670, 0x00000638,
+ 0x00000630, 0x00000640, 0x00000610, 0x00000660,
+ }
+};
+
+const struct gost28147_param gost28147_param_CryptoPro_3411 =
+{
+ 0,
+ {
+ /* 0 */
+ 0x0002d000, 0x0002a000, 0x0002a800, 0x0002b000,
+ 0x0002c000, 0x00028800, 0x00029800, 0x0002b800,
+ 0x0002e800, 0x0002e000, 0x0002f000, 0x00028000,
+ 0x0002c800, 0x00029000, 0x0002d800, 0x0002f800,
+ 0x0007d000, 0x0007a000, 0x0007a800, 0x0007b000,
+ 0x0007c000, 0x00078800, 0x00079800, 0x0007b800,
+ 0x0007e800, 0x0007e000, 0x0007f000, 0x00078000,
+ 0x0007c800, 0x00079000, 0x0007d800, 0x0007f800,
+ 0x00025000, 0x00022000, 0x00022800, 0x00023000,
+ 0x00024000, 0x00020800, 0x00021800, 0x00023800,
+ 0x00026800, 0x00026000, 0x00027000, 0x00020000,
+ 0x00024800, 0x00021000, 0x00025800, 0x00027800,
+ 0x00005000, 0x00002000, 0x00002800, 0x00003000,
+ 0x00004000, 0x00000800, 0x00001800, 0x00003800,
+ 0x00006800, 0x00006000, 0x00007000, 0x00000000,
+ 0x00004800, 0x00001000, 0x00005800, 0x00007800,
+ 0x00015000, 0x00012000, 0x00012800, 0x00013000,
+ 0x00014000, 0x00010800, 0x00011800, 0x00013800,
+ 0x00016800, 0x00016000, 0x00017000, 0x00010000,
+ 0x00014800, 0x00011000, 0x00015800, 0x00017800,
+ 0x0006d000, 0x0006a000, 0x0006a800, 0x0006b000,
+ 0x0006c000, 0x00068800, 0x00069800, 0x0006b800,
+ 0x0006e800, 0x0006e000, 0x0006f000, 0x00068000,
+ 0x0006c800, 0x00069000, 0x0006d800, 0x0006f800,
+ 0x0005d000, 0x0005a000, 0x0005a800, 0x0005b000,
+ 0x0005c000, 0x00058800, 0x00059800, 0x0005b800,
+ 0x0005e800, 0x0005e000, 0x0005f000, 0x00058000,
+ 0x0005c800, 0x00059000, 0x0005d800, 0x0005f800,
+ 0x0004d000, 0x0004a000, 0x0004a800, 0x0004b000,
+ 0x0004c000, 0x00048800, 0x00049800, 0x0004b800,
+ 0x0004e800, 0x0004e000, 0x0004f000, 0x00048000,
+ 0x0004c800, 0x00049000, 0x0004d800, 0x0004f800,
+ 0x0000d000, 0x0000a000, 0x0000a800, 0x0000b000,
+ 0x0000c000, 0x00008800, 0x00009800, 0x0000b800,
+ 0x0000e800, 0x0000e000, 0x0000f000, 0x00008000,
+ 0x0000c800, 0x00009000, 0x0000d800, 0x0000f800,
+ 0x0003d000, 0x0003a000, 0x0003a800, 0x0003b000,
+ 0x0003c000, 0x00038800, 0x00039800, 0x0003b800,
+ 0x0003e800, 0x0003e000, 0x0003f000, 0x00038000,
+ 0x0003c800, 0x00039000, 0x0003d800, 0x0003f800,
+ 0x00035000, 0x00032000, 0x00032800, 0x00033000,
+ 0x00034000, 0x00030800, 0x00031800, 0x00033800,
+ 0x00036800, 0x00036000, 0x00037000, 0x00030000,
+ 0x00034800, 0x00031000, 0x00035800, 0x00037800,
+ 0x0001d000, 0x0001a000, 0x0001a800, 0x0001b000,
+ 0x0001c000, 0x00018800, 0x00019800, 0x0001b800,
+ 0x0001e800, 0x0001e000, 0x0001f000, 0x00018000,
+ 0x0001c800, 0x00019000, 0x0001d800, 0x0001f800,
+ 0x00065000, 0x00062000, 0x00062800, 0x00063000,
+ 0x00064000, 0x00060800, 0x00061800, 0x00063800,
+ 0x00066800, 0x00066000, 0x00067000, 0x00060000,
+ 0x00064800, 0x00061000, 0x00065800, 0x00067800,
+ 0x00075000, 0x00072000, 0x00072800, 0x00073000,
+ 0x00074000, 0x00070800, 0x00071800, 0x00073800,
+ 0x00076800, 0x00076000, 0x00077000, 0x00070000,
+ 0x00074800, 0x00071000, 0x00075800, 0x00077800,
+ 0x00055000, 0x00052000, 0x00052800, 0x00053000,
+ 0x00054000, 0x00050800, 0x00051800, 0x00053800,
+ 0x00056800, 0x00056000, 0x00057000, 0x00050000,
+ 0x00054800, 0x00051000, 0x00055800, 0x00057800,
+ 0x00045000, 0x00042000, 0x00042800, 0x00043000,
+ 0x00044000, 0x00040800, 0x00041800, 0x00043800,
+ 0x00046800, 0x00046000, 0x00047000, 0x00040000,
+ 0x00044800, 0x00041000, 0x00045800, 0x00047800,
+ /* 1 */
+ 0x02380000, 0x02780000, 0x02600000, 0x02700000,
+ 0x02480000, 0x02200000, 0x02080000, 0x02000000,
+ 0x02180000, 0x02580000, 0x02280000, 0x02100000,
+ 0x02300000, 0x02500000, 0x02400000, 0x02680000,
+ 0x05380000, 0x05780000, 0x05600000, 0x05700000,
+ 0x05480000, 0x05200000, 0x05080000, 0x05000000,
+ 0x05180000, 0x05580000, 0x05280000, 0x05100000,
+ 0x05300000, 0x05500000, 0x05400000, 0x05680000,
+ 0x03b80000, 0x03f80000, 0x03e00000, 0x03f00000,
+ 0x03c80000, 0x03a00000, 0x03880000, 0x03800000,
+ 0x03980000, 0x03d80000, 0x03a80000, 0x03900000,
+ 0x03b00000, 0x03d00000, 0x03c00000, 0x03e80000,
+ 0x06380000, 0x06780000, 0x06600000, 0x06700000,
+ 0x06480000, 0x06200000, 0x06080000, 0x06000000,
+ 0x06180000, 0x06580000, 0x06280000, 0x06100000,
+ 0x06300000, 0x06500000, 0x06400000, 0x06680000,
+ 0x00380000, 0x00780000, 0x00600000, 0x00700000,
+ 0x00480000, 0x00200000, 0x00080000, 0x00000000,
+ 0x00180000, 0x00580000, 0x00280000, 0x00100000,
+ 0x00300000, 0x00500000, 0x00400000, 0x00680000,
+ 0x07b80000, 0x07f80000, 0x07e00000, 0x07f00000,
+ 0x07c80000, 0x07a00000, 0x07880000, 0x07800000,
+ 0x07980000, 0x07d80000, 0x07a80000, 0x07900000,
+ 0x07b00000, 0x07d00000, 0x07c00000, 0x07e80000,
+ 0x01380000, 0x01780000, 0x01600000, 0x01700000,
+ 0x01480000, 0x01200000, 0x01080000, 0x01000000,
+ 0x01180000, 0x01580000, 0x01280000, 0x01100000,
+ 0x01300000, 0x01500000, 0x01400000, 0x01680000,
+ 0x04380000, 0x04780000, 0x04600000, 0x04700000,
+ 0x04480000, 0x04200000, 0x04080000, 0x04000000,
+ 0x04180000, 0x04580000, 0x04280000, 0x04100000,
+ 0x04300000, 0x04500000, 0x04400000, 0x04680000,
+ 0x07380000, 0x07780000, 0x07600000, 0x07700000,
+ 0x07480000, 0x07200000, 0x07080000, 0x07000000,
+ 0x07180000, 0x07580000, 0x07280000, 0x07100000,
+ 0x07300000, 0x07500000, 0x07400000, 0x07680000,
+ 0x00b80000, 0x00f80000, 0x00e00000, 0x00f00000,
+ 0x00c80000, 0x00a00000, 0x00880000, 0x00800000,
+ 0x00980000, 0x00d80000, 0x00a80000, 0x00900000,
+ 0x00b00000, 0x00d00000, 0x00c00000, 0x00e80000,
+ 0x03380000, 0x03780000, 0x03600000, 0x03700000,
+ 0x03480000, 0x03200000, 0x03080000, 0x03000000,
+ 0x03180000, 0x03580000, 0x03280000, 0x03100000,
+ 0x03300000, 0x03500000, 0x03400000, 0x03680000,
+ 0x02b80000, 0x02f80000, 0x02e00000, 0x02f00000,
+ 0x02c80000, 0x02a00000, 0x02880000, 0x02800000,
+ 0x02980000, 0x02d80000, 0x02a80000, 0x02900000,
+ 0x02b00000, 0x02d00000, 0x02c00000, 0x02e80000,
+ 0x06b80000, 0x06f80000, 0x06e00000, 0x06f00000,
+ 0x06c80000, 0x06a00000, 0x06880000, 0x06800000,
+ 0x06980000, 0x06d80000, 0x06a80000, 0x06900000,
+ 0x06b00000, 0x06d00000, 0x06c00000, 0x06e80000,
+ 0x05b80000, 0x05f80000, 0x05e00000, 0x05f00000,
+ 0x05c80000, 0x05a00000, 0x05880000, 0x05800000,
+ 0x05980000, 0x05d80000, 0x05a80000, 0x05900000,
+ 0x05b00000, 0x05d00000, 0x05c00000, 0x05e80000,
+ 0x04b80000, 0x04f80000, 0x04e00000, 0x04f00000,
+ 0x04c80000, 0x04a00000, 0x04880000, 0x04800000,
+ 0x04980000, 0x04d80000, 0x04a80000, 0x04900000,
+ 0x04b00000, 0x04d00000, 0x04c00000, 0x04e80000,
+ 0x01b80000, 0x01f80000, 0x01e00000, 0x01f00000,
+ 0x01c80000, 0x01a00000, 0x01880000, 0x01800000,
+ 0x01980000, 0x01d80000, 0x01a80000, 0x01900000,
+ 0x01b00000, 0x01d00000, 0x01c00000, 0x01e80000,
+ /* 2 */
+ 0xb8000003, 0xb0000003, 0xa0000003, 0xd8000003,
+ 0xc8000003, 0xe0000003, 0x90000003, 0xd0000003,
+ 0x88000003, 0xc0000003, 0x80000003, 0xf0000003,
+ 0xf8000003, 0xe8000003, 0x98000003, 0xa8000003,
+ 0x38000003, 0x30000003, 0x20000003, 0x58000003,
+ 0x48000003, 0x60000003, 0x10000003, 0x50000003,
+ 0x08000003, 0x40000003, 0x00000003, 0x70000003,
+ 0x78000003, 0x68000003, 0x18000003, 0x28000003,
+ 0x38000001, 0x30000001, 0x20000001, 0x58000001,
+ 0x48000001, 0x60000001, 0x10000001, 0x50000001,
+ 0x08000001, 0x40000001, 0x00000001, 0x70000001,
+ 0x78000001, 0x68000001, 0x18000001, 0x28000001,
+ 0x38000002, 0x30000002, 0x20000002, 0x58000002,
+ 0x48000002, 0x60000002, 0x10000002, 0x50000002,
+ 0x08000002, 0x40000002, 0x00000002, 0x70000002,
+ 0x78000002, 0x68000002, 0x18000002, 0x28000002,
+ 0xb8000006, 0xb0000006, 0xa0000006, 0xd8000006,
+ 0xc8000006, 0xe0000006, 0x90000006, 0xd0000006,
+ 0x88000006, 0xc0000006, 0x80000006, 0xf0000006,
+ 0xf8000006, 0xe8000006, 0x98000006, 0xa8000006,
+ 0xb8000004, 0xb0000004, 0xa0000004, 0xd8000004,
+ 0xc8000004, 0xe0000004, 0x90000004, 0xd0000004,
+ 0x88000004, 0xc0000004, 0x80000004, 0xf0000004,
+ 0xf8000004, 0xe8000004, 0x98000004, 0xa8000004,
+ 0xb8000007, 0xb0000007, 0xa0000007, 0xd8000007,
+ 0xc8000007, 0xe0000007, 0x90000007, 0xd0000007,
+ 0x88000007, 0xc0000007, 0x80000007, 0xf0000007,
+ 0xf8000007, 0xe8000007, 0x98000007, 0xa8000007,
+ 0x38000000, 0x30000000, 0x20000000, 0x58000000,
+ 0x48000000, 0x60000000, 0x10000000, 0x50000000,
+ 0x08000000, 0x40000000, 0x00000000, 0x70000000,
+ 0x78000000, 0x68000000, 0x18000000, 0x28000000,
+ 0x38000005, 0x30000005, 0x20000005, 0x58000005,
+ 0x48000005, 0x60000005, 0x10000005, 0x50000005,
+ 0x08000005, 0x40000005, 0x00000005, 0x70000005,
+ 0x78000005, 0x68000005, 0x18000005, 0x28000005,
+ 0xb8000000, 0xb0000000, 0xa0000000, 0xd8000000,
+ 0xc8000000, 0xe0000000, 0x90000000, 0xd0000000,
+ 0x88000000, 0xc0000000, 0x80000000, 0xf0000000,
+ 0xf8000000, 0xe8000000, 0x98000000, 0xa8000000,
+ 0xb8000002, 0xb0000002, 0xa0000002, 0xd8000002,
+ 0xc8000002, 0xe0000002, 0x90000002, 0xd0000002,
+ 0x88000002, 0xc0000002, 0x80000002, 0xf0000002,
+ 0xf8000002, 0xe8000002, 0x98000002, 0xa8000002,
+ 0xb8000005, 0xb0000005, 0xa0000005, 0xd8000005,
+ 0xc8000005, 0xe0000005, 0x90000005, 0xd0000005,
+ 0x88000005, 0xc0000005, 0x80000005, 0xf0000005,
+ 0xf8000005, 0xe8000005, 0x98000005, 0xa8000005,
+ 0x38000004, 0x30000004, 0x20000004, 0x58000004,
+ 0x48000004, 0x60000004, 0x10000004, 0x50000004,
+ 0x08000004, 0x40000004, 0x00000004, 0x70000004,
+ 0x78000004, 0x68000004, 0x18000004, 0x28000004,
+ 0x38000007, 0x30000007, 0x20000007, 0x58000007,
+ 0x48000007, 0x60000007, 0x10000007, 0x50000007,
+ 0x08000007, 0x40000007, 0x00000007, 0x70000007,
+ 0x78000007, 0x68000007, 0x18000007, 0x28000007,
+ 0x38000006, 0x30000006, 0x20000006, 0x58000006,
+ 0x48000006, 0x60000006, 0x10000006, 0x50000006,
+ 0x08000006, 0x40000006, 0x00000006, 0x70000006,
+ 0x78000006, 0x68000006, 0x18000006, 0x28000006,
+ 0xb8000001, 0xb0000001, 0xa0000001, 0xd8000001,
+ 0xc8000001, 0xe0000001, 0x90000001, 0xd0000001,
+ 0x88000001, 0xc0000001, 0x80000001, 0xf0000001,
+ 0xf8000001, 0xe8000001, 0x98000001, 0xa8000001,
+ /* 3 */
+ 0x000000e8, 0x000000f0, 0x000000a0, 0x00000088,
+ 0x000000b8, 0x00000080, 0x000000a8, 0x000000d0,
+ 0x00000098, 0x000000e0, 0x000000c0, 0x000000f8,
+ 0x000000b0, 0x00000090, 0x000000c8, 0x000000d8,
+ 0x000001e8, 0x000001f0, 0x000001a0, 0x00000188,
+ 0x000001b8, 0x00000180, 0x000001a8, 0x000001d0,
+ 0x00000198, 0x000001e0, 0x000001c0, 0x000001f8,
+ 0x000001b0, 0x00000190, 0x000001c8, 0x000001d8,
+ 0x00000568, 0x00000570, 0x00000520, 0x00000508,
+ 0x00000538, 0x00000500, 0x00000528, 0x00000550,
+ 0x00000518, 0x00000560, 0x00000540, 0x00000578,
+ 0x00000530, 0x00000510, 0x00000548, 0x00000558,
+ 0x000004e8, 0x000004f0, 0x000004a0, 0x00000488,
+ 0x000004b8, 0x00000480, 0x000004a8, 0x000004d0,
+ 0x00000498, 0x000004e0, 0x000004c0, 0x000004f8,
+ 0x000004b0, 0x00000490, 0x000004c8, 0x000004d8,
+ 0x000002e8, 0x000002f0, 0x000002a0, 0x00000288,
+ 0x000002b8, 0x00000280, 0x000002a8, 0x000002d0,
+ 0x00000298, 0x000002e0, 0x000002c0, 0x000002f8,
+ 0x000002b0, 0x00000290, 0x000002c8, 0x000002d8,
+ 0x000005e8, 0x000005f0, 0x000005a0, 0x00000588,
+ 0x000005b8, 0x00000580, 0x000005a8, 0x000005d0,
+ 0x00000598, 0x000005e0, 0x000005c0, 0x000005f8,
+ 0x000005b0, 0x00000590, 0x000005c8, 0x000005d8,
+ 0x00000268, 0x00000270, 0x00000220, 0x00000208,
+ 0x00000238, 0x00000200, 0x00000228, 0x00000250,
+ 0x00000218, 0x00000260, 0x00000240, 0x00000278,
+ 0x00000230, 0x00000210, 0x00000248, 0x00000258,
+ 0x000007e8, 0x000007f0, 0x000007a0, 0x00000788,
+ 0x000007b8, 0x00000780, 0x000007a8, 0x000007d0,
+ 0x00000798, 0x000007e0, 0x000007c0, 0x000007f8,
+ 0x000007b0, 0x00000790, 0x000007c8, 0x000007d8,
+ 0x00000468, 0x00000470, 0x00000420, 0x00000408,
+ 0x00000438, 0x00000400, 0x00000428, 0x00000450,
+ 0x00000418, 0x00000460, 0x00000440, 0x00000478,
+ 0x00000430, 0x00000410, 0x00000448, 0x00000458,
+ 0x00000368, 0x00000370, 0x00000320, 0x00000308,
+ 0x00000338, 0x00000300, 0x00000328, 0x00000350,
+ 0x00000318, 0x00000360, 0x00000340, 0x00000378,
+ 0x00000330, 0x00000310, 0x00000348, 0x00000358,
+ 0x000003e8, 0x000003f0, 0x000003a0, 0x00000388,
+ 0x000003b8, 0x00000380, 0x000003a8, 0x000003d0,
+ 0x00000398, 0x000003e0, 0x000003c0, 0x000003f8,
+ 0x000003b0, 0x00000390, 0x000003c8, 0x000003d8,
+ 0x00000768, 0x00000770, 0x00000720, 0x00000708,
+ 0x00000738, 0x00000700, 0x00000728, 0x00000750,
+ 0x00000718, 0x00000760, 0x00000740, 0x00000778,
+ 0x00000730, 0x00000710, 0x00000748, 0x00000758,
+ 0x000006e8, 0x000006f0, 0x000006a0, 0x00000688,
+ 0x000006b8, 0x00000680, 0x000006a8, 0x000006d0,
+ 0x00000698, 0x000006e0, 0x000006c0, 0x000006f8,
+ 0x000006b0, 0x00000690, 0x000006c8, 0x000006d8,
+ 0x00000068, 0x00000070, 0x00000020, 0x00000008,
+ 0x00000038, 0x00000000, 0x00000028, 0x00000050,
+ 0x00000018, 0x00000060, 0x00000040, 0x00000078,
+ 0x00000030, 0x00000010, 0x00000048, 0x00000058,
+ 0x00000168, 0x00000170, 0x00000120, 0x00000108,
+ 0x00000138, 0x00000100, 0x00000128, 0x00000150,
+ 0x00000118, 0x00000160, 0x00000140, 0x00000178,
+ 0x00000130, 0x00000110, 0x00000148, 0x00000158,
+ 0x00000668, 0x00000670, 0x00000620, 0x00000608,
+ 0x00000638, 0x00000600, 0x00000628, 0x00000650,
+ 0x00000618, 0x00000660, 0x00000640, 0x00000678,
+ 0x00000630, 0x00000610, 0x00000648, 0x00000658,
+ }
+};
+
+const struct gost28147_param gost28147_param_Test_89 =
+{
+ 0,
+ {
+ /* 0 */
+ 0x00062000, 0x00061000, 0x00067800, 0x00062800,
+ 0x00064800, 0x00060800, 0x00060000, 0x00064000,
+ 0x00067000, 0x00061800, 0x00065800, 0x00066000,
+ 0x00066800, 0x00063800, 0x00065000, 0x00063000,
+ 0x0004a000, 0x00049000, 0x0004f800, 0x0004a800,
+ 0x0004c800, 0x00048800, 0x00048000, 0x0004c000,
+ 0x0004f000, 0x00049800, 0x0004d800, 0x0004e000,
+ 0x0004e800, 0x0004b800, 0x0004d000, 0x0004b000,
+ 0x0007a000, 0x00079000, 0x0007f800, 0x0007a800,
+ 0x0007c800, 0x00078800, 0x00078000, 0x0007c000,
+ 0x0007f000, 0x00079800, 0x0007d800, 0x0007e000,
+ 0x0007e800, 0x0007b800, 0x0007d000, 0x0007b000,
+ 0x00072000, 0x00071000, 0x00077800, 0x00072800,
+ 0x00074800, 0x00070800, 0x00070000, 0x00074000,
+ 0x00077000, 0x00071800, 0x00075800, 0x00076000,
+ 0x00076800, 0x00073800, 0x00075000, 0x00073000,
+ 0x00042000, 0x00041000, 0x00047800, 0x00042800,
+ 0x00044800, 0x00040800, 0x00040000, 0x00044000,
+ 0x00047000, 0x00041800, 0x00045800, 0x00046000,
+ 0x00046800, 0x00043800, 0x00045000, 0x00043000,
+ 0x0000a000, 0x00009000, 0x0000f800, 0x0000a800,
+ 0x0000c800, 0x00008800, 0x00008000, 0x0000c000,
+ 0x0000f000, 0x00009800, 0x0000d800, 0x0000e000,
+ 0x0000e800, 0x0000b800, 0x0000d000, 0x0000b000,
+ 0x0001a000, 0x00019000, 0x0001f800, 0x0001a800,
+ 0x0001c800, 0x00018800, 0x00018000, 0x0001c000,
+ 0x0001f000, 0x00019800, 0x0001d800, 0x0001e000,
+ 0x0001e800, 0x0001b800, 0x0001d000, 0x0001b000,
+ 0x00052000, 0x00051000, 0x00057800, 0x00052800,
+ 0x00054800, 0x00050800, 0x00050000, 0x00054000,
+ 0x00057000, 0x00051800, 0x00055800, 0x00056000,
+ 0x00056800, 0x00053800, 0x00055000, 0x00053000,
+ 0x00012000, 0x00011000, 0x00017800, 0x00012800,
+ 0x00014800, 0x00010800, 0x00010000, 0x00014000,
+ 0x00017000, 0x00011800, 0x00015800, 0x00016000,
+ 0x00016800, 0x00013800, 0x00015000, 0x00013000,
+ 0x0003a000, 0x00039000, 0x0003f800, 0x0003a800,
+ 0x0003c800, 0x00038800, 0x00038000, 0x0003c000,
+ 0x0003f000, 0x00039800, 0x0003d800, 0x0003e000,
+ 0x0003e800, 0x0003b800, 0x0003d000, 0x0003b000,
+ 0x00022000, 0x00021000, 0x00027800, 0x00022800,
+ 0x00024800, 0x00020800, 0x00020000, 0x00024000,
+ 0x00027000, 0x00021800, 0x00025800, 0x00026000,
+ 0x00026800, 0x00023800, 0x00025000, 0x00023000,
+ 0x0006a000, 0x00069000, 0x0006f800, 0x0006a800,
+ 0x0006c800, 0x00068800, 0x00068000, 0x0006c000,
+ 0x0006f000, 0x00069800, 0x0006d800, 0x0006e000,
+ 0x0006e800, 0x0006b800, 0x0006d000, 0x0006b000,
+ 0x00032000, 0x00031000, 0x00037800, 0x00032800,
+ 0x00034800, 0x00030800, 0x00030000, 0x00034000,
+ 0x00037000, 0x00031800, 0x00035800, 0x00036000,
+ 0x00036800, 0x00033800, 0x00035000, 0x00033000,
+ 0x00002000, 0x00001000, 0x00007800, 0x00002800,
+ 0x00004800, 0x00000800, 0x00000000, 0x00004000,
+ 0x00007000, 0x00001800, 0x00005800, 0x00006000,
+ 0x00006800, 0x00003800, 0x00005000, 0x00003000,
+ 0x0005a000, 0x00059000, 0x0005f800, 0x0005a800,
+ 0x0005c800, 0x00058800, 0x00058000, 0x0005c000,
+ 0x0005f000, 0x00059800, 0x0005d800, 0x0005e000,
+ 0x0005e800, 0x0005b800, 0x0005d000, 0x0005b000,
+ 0x0002a000, 0x00029000, 0x0002f800, 0x0002a800,
+ 0x0002c800, 0x00028800, 0x00028000, 0x0002c000,
+ 0x0002f000, 0x00029800, 0x0002d800, 0x0002e000,
+ 0x0002e800, 0x0002b800, 0x0002d000, 0x0002b000,
+ /* 1 */
+ 0x07680000, 0x07400000, 0x07700000, 0x07600000,
+ 0x07380000, 0x07180000, 0x07480000, 0x07500000,
+ 0x07080000, 0x07280000, 0x07100000, 0x07200000,
+ 0x07300000, 0x07780000, 0x07000000, 0x07580000,
+ 0x04e80000, 0x04c00000, 0x04f00000, 0x04e00000,
+ 0x04b80000, 0x04980000, 0x04c80000, 0x04d00000,
+ 0x04880000, 0x04a80000, 0x04900000, 0x04a00000,
+ 0x04b00000, 0x04f80000, 0x04800000, 0x04d80000,
+ 0x05e80000, 0x05c00000, 0x05f00000, 0x05e00000,
+ 0x05b80000, 0x05980000, 0x05c80000, 0x05d00000,
+ 0x05880000, 0x05a80000, 0x05900000, 0x05a00000,
+ 0x05b00000, 0x05f80000, 0x05800000, 0x05d80000,
+ 0x01680000, 0x01400000, 0x01700000, 0x01600000,
+ 0x01380000, 0x01180000, 0x01480000, 0x01500000,
+ 0x01080000, 0x01280000, 0x01100000, 0x01200000,
+ 0x01300000, 0x01780000, 0x01000000, 0x01580000,
+ 0x02e80000, 0x02c00000, 0x02f00000, 0x02e00000,
+ 0x02b80000, 0x02980000, 0x02c80000, 0x02d00000,
+ 0x02880000, 0x02a80000, 0x02900000, 0x02a00000,
+ 0x02b00000, 0x02f80000, 0x02800000, 0x02d80000,
+ 0x07e80000, 0x07c00000, 0x07f00000, 0x07e00000,
+ 0x07b80000, 0x07980000, 0x07c80000, 0x07d00000,
+ 0x07880000, 0x07a80000, 0x07900000, 0x07a00000,
+ 0x07b00000, 0x07f80000, 0x07800000, 0x07d80000,
+ 0x03e80000, 0x03c00000, 0x03f00000, 0x03e00000,
+ 0x03b80000, 0x03980000, 0x03c80000, 0x03d00000,
+ 0x03880000, 0x03a80000, 0x03900000, 0x03a00000,
+ 0x03b00000, 0x03f80000, 0x03800000, 0x03d80000,
+ 0x00e80000, 0x00c00000, 0x00f00000, 0x00e00000,
+ 0x00b80000, 0x00980000, 0x00c80000, 0x00d00000,
+ 0x00880000, 0x00a80000, 0x00900000, 0x00a00000,
+ 0x00b00000, 0x00f80000, 0x00800000, 0x00d80000,
+ 0x00680000, 0x00400000, 0x00700000, 0x00600000,
+ 0x00380000, 0x00180000, 0x00480000, 0x00500000,
+ 0x00080000, 0x00280000, 0x00100000, 0x00200000,
+ 0x00300000, 0x00780000, 0x00000000, 0x00580000,
+ 0x06e80000, 0x06c00000, 0x06f00000, 0x06e00000,
+ 0x06b80000, 0x06980000, 0x06c80000, 0x06d00000,
+ 0x06880000, 0x06a80000, 0x06900000, 0x06a00000,
+ 0x06b00000, 0x06f80000, 0x06800000, 0x06d80000,
+ 0x06680000, 0x06400000, 0x06700000, 0x06600000,
+ 0x06380000, 0x06180000, 0x06480000, 0x06500000,
+ 0x06080000, 0x06280000, 0x06100000, 0x06200000,
+ 0x06300000, 0x06780000, 0x06000000, 0x06580000,
+ 0x03680000, 0x03400000, 0x03700000, 0x03600000,
+ 0x03380000, 0x03180000, 0x03480000, 0x03500000,
+ 0x03080000, 0x03280000, 0x03100000, 0x03200000,
+ 0x03300000, 0x03780000, 0x03000000, 0x03580000,
+ 0x05680000, 0x05400000, 0x05700000, 0x05600000,
+ 0x05380000, 0x05180000, 0x05480000, 0x05500000,
+ 0x05080000, 0x05280000, 0x05100000, 0x05200000,
+ 0x05300000, 0x05780000, 0x05000000, 0x05580000,
+ 0x02680000, 0x02400000, 0x02700000, 0x02600000,
+ 0x02380000, 0x02180000, 0x02480000, 0x02500000,
+ 0x02080000, 0x02280000, 0x02100000, 0x02200000,
+ 0x02300000, 0x02780000, 0x02000000, 0x02580000,
+ 0x01e80000, 0x01c00000, 0x01f00000, 0x01e00000,
+ 0x01b80000, 0x01980000, 0x01c80000, 0x01d00000,
+ 0x01880000, 0x01a80000, 0x01900000, 0x01a00000,
+ 0x01b00000, 0x01f80000, 0x01800000, 0x01d80000,
+ 0x04680000, 0x04400000, 0x04700000, 0x04600000,
+ 0x04380000, 0x04180000, 0x04480000, 0x04500000,
+ 0x04080000, 0x04280000, 0x04100000, 0x04200000,
+ 0x04300000, 0x04780000, 0x04000000, 0x04580000,
+ /* 2 */
+ 0x18000004, 0x70000004, 0x28000004, 0x48000004,
+ 0x30000004, 0x40000004, 0x00000004, 0x68000004,
+ 0x50000004, 0x58000004, 0x38000004, 0x60000004,
+ 0x10000004, 0x08000004, 0x78000004, 0x20000004,
+ 0x98000007, 0xf0000007, 0xa8000007, 0xc8000007,
+ 0xb0000007, 0xc0000007, 0x80000007, 0xe8000007,
+ 0xd0000007, 0xd8000007, 0xb8000007, 0xe0000007,
+ 0x90000007, 0x88000007, 0xf8000007, 0xa0000007,
+ 0x18000003, 0x70000003, 0x28000003, 0x48000003,
+ 0x30000003, 0x40000003, 0x00000003, 0x68000003,
+ 0x50000003, 0x58000003, 0x38000003, 0x60000003,
+ 0x10000003, 0x08000003, 0x78000003, 0x20000003,
+ 0x98000005, 0xf0000005, 0xa8000005, 0xc8000005,
+ 0xb0000005, 0xc0000005, 0x80000005, 0xe8000005,
+ 0xd0000005, 0xd8000005, 0xb8000005, 0xe0000005,
+ 0x90000005, 0x88000005, 0xf8000005, 0xa0000005,
+ 0x98000000, 0xf0000000, 0xa8000000, 0xc8000000,
+ 0xb0000000, 0xc0000000, 0x80000000, 0xe8000000,
+ 0xd0000000, 0xd8000000, 0xb8000000, 0xe0000000,
+ 0x90000000, 0x88000000, 0xf8000000, 0xa0000000,
+ 0x98000004, 0xf0000004, 0xa8000004, 0xc8000004,
+ 0xb0000004, 0xc0000004, 0x80000004, 0xe8000004,
+ 0xd0000004, 0xd8000004, 0xb8000004, 0xe0000004,
+ 0x90000004, 0x88000004, 0xf8000004, 0xa0000004,
+ 0x18000006, 0x70000006, 0x28000006, 0x48000006,
+ 0x30000006, 0x40000006, 0x00000006, 0x68000006,
+ 0x50000006, 0x58000006, 0x38000006, 0x60000006,
+ 0x10000006, 0x08000006, 0x78000006, 0x20000006,
+ 0x98000002, 0xf0000002, 0xa8000002, 0xc8000002,
+ 0xb0000002, 0xc0000002, 0x80000002, 0xe8000002,
+ 0xd0000002, 0xd8000002, 0xb8000002, 0xe0000002,
+ 0x90000002, 0x88000002, 0xf8000002, 0xa0000002,
+ 0x98000006, 0xf0000006, 0xa8000006, 0xc8000006,
+ 0xb0000006, 0xc0000006, 0x80000006, 0xe8000006,
+ 0xd0000006, 0xd8000006, 0xb8000006, 0xe0000006,
+ 0x90000006, 0x88000006, 0xf8000006, 0xa0000006,
+ 0x98000001, 0xf0000001, 0xa8000001, 0xc8000001,
+ 0xb0000001, 0xc0000001, 0x80000001, 0xe8000001,
+ 0xd0000001, 0xd8000001, 0xb8000001, 0xe0000001,
+ 0x90000001, 0x88000001, 0xf8000001, 0xa0000001,
+ 0x98000003, 0xf0000003, 0xa8000003, 0xc8000003,
+ 0xb0000003, 0xc0000003, 0x80000003, 0xe8000003,
+ 0xd0000003, 0xd8000003, 0xb8000003, 0xe0000003,
+ 0x90000003, 0x88000003, 0xf8000003, 0xa0000003,
+ 0x18000005, 0x70000005, 0x28000005, 0x48000005,
+ 0x30000005, 0x40000005, 0x00000005, 0x68000005,
+ 0x50000005, 0x58000005, 0x38000005, 0x60000005,
+ 0x10000005, 0x08000005, 0x78000005, 0x20000005,
+ 0x18000000, 0x70000000, 0x28000000, 0x48000000,
+ 0x30000000, 0x40000000, 0x00000000, 0x68000000,
+ 0x50000000, 0x58000000, 0x38000000, 0x60000000,
+ 0x10000000, 0x08000000, 0x78000000, 0x20000000,
+ 0x18000007, 0x70000007, 0x28000007, 0x48000007,
+ 0x30000007, 0x40000007, 0x00000007, 0x68000007,
+ 0x50000007, 0x58000007, 0x38000007, 0x60000007,
+ 0x10000007, 0x08000007, 0x78000007, 0x20000007,
+ 0x18000001, 0x70000001, 0x28000001, 0x48000001,
+ 0x30000001, 0x40000001, 0x00000001, 0x68000001,
+ 0x50000001, 0x58000001, 0x38000001, 0x60000001,
+ 0x10000001, 0x08000001, 0x78000001, 0x20000001,
+ 0x18000002, 0x70000002, 0x28000002, 0x48000002,
+ 0x30000002, 0x40000002, 0x00000002, 0x68000002,
+ 0x50000002, 0x58000002, 0x38000002, 0x60000002,
+ 0x10000002, 0x08000002, 0x78000002, 0x20000002,
+ /* 3 */
+ 0x00000648, 0x00000658, 0x00000660, 0x00000600,
+ 0x00000618, 0x00000630, 0x00000638, 0x00000628,
+ 0x00000620, 0x00000640, 0x00000670, 0x00000678,
+ 0x00000608, 0x00000650, 0x00000610, 0x00000668,
+ 0x00000348, 0x00000358, 0x00000360, 0x00000300,
+ 0x00000318, 0x00000330, 0x00000338, 0x00000328,
+ 0x00000320, 0x00000340, 0x00000370, 0x00000378,
+ 0x00000308, 0x00000350, 0x00000310, 0x00000368,
+ 0x000002c8, 0x000002d8, 0x000002e0, 0x00000280,
+ 0x00000298, 0x000002b0, 0x000002b8, 0x000002a8,
+ 0x000002a0, 0x000002c0, 0x000002f0, 0x000002f8,
+ 0x00000288, 0x000002d0, 0x00000290, 0x000002e8,
+ 0x00000148, 0x00000158, 0x00000160, 0x00000100,
+ 0x00000118, 0x00000130, 0x00000138, 0x00000128,
+ 0x00000120, 0x00000140, 0x00000170, 0x00000178,
+ 0x00000108, 0x00000150, 0x00000110, 0x00000168,
+ 0x000005c8, 0x000005d8, 0x000005e0, 0x00000580,
+ 0x00000598, 0x000005b0, 0x000005b8, 0x000005a8,
+ 0x000005a0, 0x000005c0, 0x000005f0, 0x000005f8,
+ 0x00000588, 0x000005d0, 0x00000590, 0x000005e8,
+ 0x00000048, 0x00000058, 0x00000060, 0x00000000,
+ 0x00000018, 0x00000030, 0x00000038, 0x00000028,
+ 0x00000020, 0x00000040, 0x00000070, 0x00000078,
+ 0x00000008, 0x00000050, 0x00000010, 0x00000068,
+ 0x000004c8, 0x000004d8, 0x000004e0, 0x00000480,
+ 0x00000498, 0x000004b0, 0x000004b8, 0x000004a8,
+ 0x000004a0, 0x000004c0, 0x000004f0, 0x000004f8,
+ 0x00000488, 0x000004d0, 0x00000490, 0x000004e8,
+ 0x000006c8, 0x000006d8, 0x000006e0, 0x00000680,
+ 0x00000698, 0x000006b0, 0x000006b8, 0x000006a8,
+ 0x000006a0, 0x000006c0, 0x000006f0, 0x000006f8,
+ 0x00000688, 0x000006d0, 0x00000690, 0x000006e8,
+ 0x000001c8, 0x000001d8, 0x000001e0, 0x00000180,
+ 0x00000198, 0x000001b0, 0x000001b8, 0x000001a8,
+ 0x000001a0, 0x000001c0, 0x000001f0, 0x000001f8,
+ 0x00000188, 0x000001d0, 0x00000190, 0x000001e8,
+ 0x00000748, 0x00000758, 0x00000760, 0x00000700,
+ 0x00000718, 0x00000730, 0x00000738, 0x00000728,
+ 0x00000720, 0x00000740, 0x00000770, 0x00000778,
+ 0x00000708, 0x00000750, 0x00000710, 0x00000768,
+ 0x000003c8, 0x000003d8, 0x000003e0, 0x00000380,
+ 0x00000398, 0x000003b0, 0x000003b8, 0x000003a8,
+ 0x000003a0, 0x000003c0, 0x000003f0, 0x000003f8,
+ 0x00000388, 0x000003d0, 0x00000390, 0x000003e8,
+ 0x00000548, 0x00000558, 0x00000560, 0x00000500,
+ 0x00000518, 0x00000530, 0x00000538, 0x00000528,
+ 0x00000520, 0x00000540, 0x00000570, 0x00000578,
+ 0x00000508, 0x00000550, 0x00000510, 0x00000568,
+ 0x000007c8, 0x000007d8, 0x000007e0, 0x00000780,
+ 0x00000798, 0x000007b0, 0x000007b8, 0x000007a8,
+ 0x000007a0, 0x000007c0, 0x000007f0, 0x000007f8,
+ 0x00000788, 0x000007d0, 0x00000790, 0x000007e8,
+ 0x00000248, 0x00000258, 0x00000260, 0x00000200,
+ 0x00000218, 0x00000230, 0x00000238, 0x00000228,
+ 0x00000220, 0x00000240, 0x00000270, 0x00000278,
+ 0x00000208, 0x00000250, 0x00000210, 0x00000268,
+ 0x000000c8, 0x000000d8, 0x000000e0, 0x00000080,
+ 0x00000098, 0x000000b0, 0x000000b8, 0x000000a8,
+ 0x000000a0, 0x000000c0, 0x000000f0, 0x000000f8,
+ 0x00000088, 0x000000d0, 0x00000090, 0x000000e8,
+ 0x00000448, 0x00000458, 0x00000460, 0x00000400,
+ 0x00000418, 0x00000430, 0x00000438, 0x00000428,
+ 0x00000420, 0x00000440, 0x00000470, 0x00000478,
+ 0x00000408, 0x00000450, 0x00000410, 0x00000468,
+ }
+};
+
+const struct gost28147_param gost28147_param_CryptoPro_A =
+{
+ 1,
+ {
+ /* 0 */
+ 0x0001c800, 0x0001b000, 0x00019800, 0x00019000,
+ 0x0001c000, 0x0001d800, 0x00018800, 0x0001b800,
+ 0x0001d000, 0x0001a000, 0x0001f000, 0x0001f800,
+ 0x0001e000, 0x00018000, 0x0001e800, 0x0001a800,
+ 0x0003c800, 0x0003b000, 0x00039800, 0x00039000,
+ 0x0003c000, 0x0003d800, 0x00038800, 0x0003b800,
+ 0x0003d000, 0x0003a000, 0x0003f000, 0x0003f800,
+ 0x0003e000, 0x00038000, 0x0003e800, 0x0003a800,
+ 0x00074800, 0x00073000, 0x00071800, 0x00071000,
+ 0x00074000, 0x00075800, 0x00070800, 0x00073800,
+ 0x00075000, 0x00072000, 0x00077000, 0x00077800,
+ 0x00076000, 0x00070000, 0x00076800, 0x00072800,
+ 0x0004c800, 0x0004b000, 0x00049800, 0x00049000,
+ 0x0004c000, 0x0004d800, 0x00048800, 0x0004b800,
+ 0x0004d000, 0x0004a000, 0x0004f000, 0x0004f800,
+ 0x0004e000, 0x00048000, 0x0004e800, 0x0004a800,
+ 0x00044800, 0x00043000, 0x00041800, 0x00041000,
+ 0x00044000, 0x00045800, 0x00040800, 0x00043800,
+ 0x00045000, 0x00042000, 0x00047000, 0x00047800,
+ 0x00046000, 0x00040000, 0x00046800, 0x00042800,
+ 0x00054800, 0x00053000, 0x00051800, 0x00051000,
+ 0x00054000, 0x00055800, 0x00050800, 0x00053800,
+ 0x00055000, 0x00052000, 0x00057000, 0x00057800,
+ 0x00056000, 0x00050000, 0x00056800, 0x00052800,
+ 0x0007c800, 0x0007b000, 0x00079800, 0x00079000,
+ 0x0007c000, 0x0007d800, 0x00078800, 0x0007b800,
+ 0x0007d000, 0x0007a000, 0x0007f000, 0x0007f800,
+ 0x0007e000, 0x00078000, 0x0007e800, 0x0007a800,
+ 0x00004800, 0x00003000, 0x00001800, 0x00001000,
+ 0x00004000, 0x00005800, 0x00000800, 0x00003800,
+ 0x00005000, 0x00002000, 0x00007000, 0x00007800,
+ 0x00006000, 0x00000000, 0x00006800, 0x00002800,
+ 0x0002c800, 0x0002b000, 0x00029800, 0x00029000,
+ 0x0002c000, 0x0002d800, 0x00028800, 0x0002b800,
+ 0x0002d000, 0x0002a000, 0x0002f000, 0x0002f800,
+ 0x0002e000, 0x00028000, 0x0002e800, 0x0002a800,
+ 0x00014800, 0x00013000, 0x00011800, 0x00011000,
+ 0x00014000, 0x00015800, 0x00010800, 0x00013800,
+ 0x00015000, 0x00012000, 0x00017000, 0x00017800,
+ 0x00016000, 0x00010000, 0x00016800, 0x00012800,
+ 0x00034800, 0x00033000, 0x00031800, 0x00031000,
+ 0x00034000, 0x00035800, 0x00030800, 0x00033800,
+ 0x00035000, 0x00032000, 0x00037000, 0x00037800,
+ 0x00036000, 0x00030000, 0x00036800, 0x00032800,
+ 0x00064800, 0x00063000, 0x00061800, 0x00061000,
+ 0x00064000, 0x00065800, 0x00060800, 0x00063800,
+ 0x00065000, 0x00062000, 0x00067000, 0x00067800,
+ 0x00066000, 0x00060000, 0x00066800, 0x00062800,
+ 0x0005c800, 0x0005b000, 0x00059800, 0x00059000,
+ 0x0005c000, 0x0005d800, 0x00058800, 0x0005b800,
+ 0x0005d000, 0x0005a000, 0x0005f000, 0x0005f800,
+ 0x0005e000, 0x00058000, 0x0005e800, 0x0005a800,
+ 0x00024800, 0x00023000, 0x00021800, 0x00021000,
+ 0x00024000, 0x00025800, 0x00020800, 0x00023800,
+ 0x00025000, 0x00022000, 0x00027000, 0x00027800,
+ 0x00026000, 0x00020000, 0x00026800, 0x00022800,
+ 0x0006c800, 0x0006b000, 0x00069800, 0x00069000,
+ 0x0006c000, 0x0006d800, 0x00068800, 0x0006b800,
+ 0x0006d000, 0x0006a000, 0x0006f000, 0x0006f800,
+ 0x0006e000, 0x00068000, 0x0006e800, 0x0006a800,
+ 0x0000c800, 0x0000b000, 0x00009800, 0x00009000,
+ 0x0000c000, 0x0000d800, 0x00008800, 0x0000b800,
+ 0x0000d000, 0x0000a000, 0x0000f000, 0x0000f800,
+ 0x0000e000, 0x00008000, 0x0000e800, 0x0000a800,
+ /* 1 */
+ 0x07700000, 0x07200000, 0x07300000, 0x07100000,
+ 0x07580000, 0x07180000, 0x07680000, 0x07400000,
+ 0x07600000, 0x07780000, 0x07280000, 0x07500000,
+ 0x07000000, 0x07380000, 0x07080000, 0x07480000,
+ 0x03f00000, 0x03a00000, 0x03b00000, 0x03900000,
+ 0x03d80000, 0x03980000, 0x03e80000, 0x03c00000,
+ 0x03e00000, 0x03f80000, 0x03a80000, 0x03d00000,
+ 0x03800000, 0x03b80000, 0x03880000, 0x03c80000,
+ 0x05700000, 0x05200000, 0x05300000, 0x05100000,
+ 0x05580000, 0x05180000, 0x05680000, 0x05400000,
+ 0x05600000, 0x05780000, 0x05280000, 0x05500000,
+ 0x05000000, 0x05380000, 0x05080000, 0x05480000,
+ 0x06700000, 0x06200000, 0x06300000, 0x06100000,
+ 0x06580000, 0x06180000, 0x06680000, 0x06400000,
+ 0x06600000, 0x06780000, 0x06280000, 0x06500000,
+ 0x06000000, 0x06380000, 0x06080000, 0x06480000,
+ 0x06f00000, 0x06a00000, 0x06b00000, 0x06900000,
+ 0x06d80000, 0x06980000, 0x06e80000, 0x06c00000,
+ 0x06e00000, 0x06f80000, 0x06a80000, 0x06d00000,
+ 0x06800000, 0x06b80000, 0x06880000, 0x06c80000,
+ 0x00f00000, 0x00a00000, 0x00b00000, 0x00900000,
+ 0x00d80000, 0x00980000, 0x00e80000, 0x00c00000,
+ 0x00e00000, 0x00f80000, 0x00a80000, 0x00d00000,
+ 0x00800000, 0x00b80000, 0x00880000, 0x00c80000,
+ 0x01f00000, 0x01a00000, 0x01b00000, 0x01900000,
+ 0x01d80000, 0x01980000, 0x01e80000, 0x01c00000,
+ 0x01e00000, 0x01f80000, 0x01a80000, 0x01d00000,
+ 0x01800000, 0x01b80000, 0x01880000, 0x01c80000,
+ 0x04f00000, 0x04a00000, 0x04b00000, 0x04900000,
+ 0x04d80000, 0x04980000, 0x04e80000, 0x04c00000,
+ 0x04e00000, 0x04f80000, 0x04a80000, 0x04d00000,
+ 0x04800000, 0x04b80000, 0x04880000, 0x04c80000,
+ 0x00700000, 0x00200000, 0x00300000, 0x00100000,
+ 0x00580000, 0x00180000, 0x00680000, 0x00400000,
+ 0x00600000, 0x00780000, 0x00280000, 0x00500000,
+ 0x00000000, 0x00380000, 0x00080000, 0x00480000,
+ 0x01700000, 0x01200000, 0x01300000, 0x01100000,
+ 0x01580000, 0x01180000, 0x01680000, 0x01400000,
+ 0x01600000, 0x01780000, 0x01280000, 0x01500000,
+ 0x01000000, 0x01380000, 0x01080000, 0x01480000,
+ 0x05f00000, 0x05a00000, 0x05b00000, 0x05900000,
+ 0x05d80000, 0x05980000, 0x05e80000, 0x05c00000,
+ 0x05e00000, 0x05f80000, 0x05a80000, 0x05d00000,
+ 0x05800000, 0x05b80000, 0x05880000, 0x05c80000,
+ 0x02700000, 0x02200000, 0x02300000, 0x02100000,
+ 0x02580000, 0x02180000, 0x02680000, 0x02400000,
+ 0x02600000, 0x02780000, 0x02280000, 0x02500000,
+ 0x02000000, 0x02380000, 0x02080000, 0x02480000,
+ 0x07f00000, 0x07a00000, 0x07b00000, 0x07900000,
+ 0x07d80000, 0x07980000, 0x07e80000, 0x07c00000,
+ 0x07e00000, 0x07f80000, 0x07a80000, 0x07d00000,
+ 0x07800000, 0x07b80000, 0x07880000, 0x07c80000,
+ 0x04700000, 0x04200000, 0x04300000, 0x04100000,
+ 0x04580000, 0x04180000, 0x04680000, 0x04400000,
+ 0x04600000, 0x04780000, 0x04280000, 0x04500000,
+ 0x04000000, 0x04380000, 0x04080000, 0x04480000,
+ 0x02f00000, 0x02a00000, 0x02b00000, 0x02900000,
+ 0x02d80000, 0x02980000, 0x02e80000, 0x02c00000,
+ 0x02e00000, 0x02f80000, 0x02a80000, 0x02d00000,
+ 0x02800000, 0x02b80000, 0x02880000, 0x02c80000,
+ 0x03700000, 0x03200000, 0x03300000, 0x03100000,
+ 0x03580000, 0x03180000, 0x03680000, 0x03400000,
+ 0x03600000, 0x03780000, 0x03280000, 0x03500000,
+ 0x03000000, 0x03380000, 0x03080000, 0x03480000,
+ /* 2 */
+ 0xd8000001, 0xa8000001, 0x88000001, 0xc8000001,
+ 0xc0000001, 0xe8000001, 0xf8000001, 0x80000001,
+ 0xf0000001, 0xa0000001, 0x90000001, 0x98000001,
+ 0xe0000001, 0xb8000001, 0xd0000001, 0xb0000001,
+ 0x58000005, 0x28000005, 0x08000005, 0x48000005,
+ 0x40000005, 0x68000005, 0x78000005, 0x00000005,
+ 0x70000005, 0x20000005, 0x10000005, 0x18000005,
+ 0x60000005, 0x38000005, 0x50000005, 0x30000005,
+ 0xd8000006, 0xa8000006, 0x88000006, 0xc8000006,
+ 0xc0000006, 0xe8000006, 0xf8000006, 0x80000006,
+ 0xf0000006, 0xa0000006, 0x90000006, 0x98000006,
+ 0xe0000006, 0xb8000006, 0xd0000006, 0xb0000006,
+ 0x58000006, 0x28000006, 0x08000006, 0x48000006,
+ 0x40000006, 0x68000006, 0x78000006, 0x00000006,
+ 0x70000006, 0x20000006, 0x10000006, 0x18000006,
+ 0x60000006, 0x38000006, 0x50000006, 0x30000006,
+ 0xd8000000, 0xa8000000, 0x88000000, 0xc8000000,
+ 0xc0000000, 0xe8000000, 0xf8000000, 0x80000000,
+ 0xf0000000, 0xa0000000, 0x90000000, 0x98000000,
+ 0xe0000000, 0xb8000000, 0xd0000000, 0xb0000000,
+ 0x58000001, 0x28000001, 0x08000001, 0x48000001,
+ 0x40000001, 0x68000001, 0x78000001, 0x00000001,
+ 0x70000001, 0x20000001, 0x10000001, 0x18000001,
+ 0x60000001, 0x38000001, 0x50000001, 0x30000001,
+ 0x58000000, 0x28000000, 0x08000000, 0x48000000,
+ 0x40000000, 0x68000000, 0x78000000, 0x00000000,
+ 0x70000000, 0x20000000, 0x10000000, 0x18000000,
+ 0x60000000, 0x38000000, 0x50000000, 0x30000000,
+ 0xd8000005, 0xa8000005, 0x88000005, 0xc8000005,
+ 0xc0000005, 0xe8000005, 0xf8000005, 0x80000005,
+ 0xf0000005, 0xa0000005, 0x90000005, 0x98000005,
+ 0xe0000005, 0xb8000005, 0xd0000005, 0xb0000005,
+ 0xd8000003, 0xa8000003, 0x88000003, 0xc8000003,
+ 0xc0000003, 0xe8000003, 0xf8000003, 0x80000003,
+ 0xf0000003, 0xa0000003, 0x90000003, 0x98000003,
+ 0xe0000003, 0xb8000003, 0xd0000003, 0xb0000003,
+ 0xd8000002, 0xa8000002, 0x88000002, 0xc8000002,
+ 0xc0000002, 0xe8000002, 0xf8000002, 0x80000002,
+ 0xf0000002, 0xa0000002, 0x90000002, 0x98000002,
+ 0xe0000002, 0xb8000002, 0xd0000002, 0xb0000002,
+ 0xd8000004, 0xa8000004, 0x88000004, 0xc8000004,
+ 0xc0000004, 0xe8000004, 0xf8000004, 0x80000004,
+ 0xf0000004, 0xa0000004, 0x90000004, 0x98000004,
+ 0xe0000004, 0xb8000004, 0xd0000004, 0xb0000004,
+ 0x58000002, 0x28000002, 0x08000002, 0x48000002,
+ 0x40000002, 0x68000002, 0x78000002, 0x00000002,
+ 0x70000002, 0x20000002, 0x10000002, 0x18000002,
+ 0x60000002, 0x38000002, 0x50000002, 0x30000002,
+ 0x58000004, 0x28000004, 0x08000004, 0x48000004,
+ 0x40000004, 0x68000004, 0x78000004, 0x00000004,
+ 0x70000004, 0x20000004, 0x10000004, 0x18000004,
+ 0x60000004, 0x38000004, 0x50000004, 0x30000004,
+ 0xd8000007, 0xa8000007, 0x88000007, 0xc8000007,
+ 0xc0000007, 0xe8000007, 0xf8000007, 0x80000007,
+ 0xf0000007, 0xa0000007, 0x90000007, 0x98000007,
+ 0xe0000007, 0xb8000007, 0xd0000007, 0xb0000007,
+ 0x58000007, 0x28000007, 0x08000007, 0x48000007,
+ 0x40000007, 0x68000007, 0x78000007, 0x00000007,
+ 0x70000007, 0x20000007, 0x10000007, 0x18000007,
+ 0x60000007, 0x38000007, 0x50000007, 0x30000007,
+ 0x58000003, 0x28000003, 0x08000003, 0x48000003,
+ 0x40000003, 0x68000003, 0x78000003, 0x00000003,
+ 0x70000003, 0x20000003, 0x10000003, 0x18000003,
+ 0x60000003, 0x38000003, 0x50000003, 0x30000003,
+ /* 3 */
+ 0x00000588, 0x000005e8, 0x00000590, 0x000005c8,
+ 0x000005b8, 0x000005d0, 0x000005b0, 0x00000580,
+ 0x000005c0, 0x000005e0, 0x000005a0, 0x000005a8,
+ 0x000005f8, 0x00000598, 0x000005d8, 0x000005f0,
+ 0x00000508, 0x00000568, 0x00000510, 0x00000548,
+ 0x00000538, 0x00000550, 0x00000530, 0x00000500,
+ 0x00000540, 0x00000560, 0x00000520, 0x00000528,
+ 0x00000578, 0x00000518, 0x00000558, 0x00000570,
+ 0x00000788, 0x000007e8, 0x00000790, 0x000007c8,
+ 0x000007b8, 0x000007d0, 0x000007b0, 0x00000780,
+ 0x000007c0, 0x000007e0, 0x000007a0, 0x000007a8,
+ 0x000007f8, 0x00000798, 0x000007d8, 0x000007f0,
+ 0x00000288, 0x000002e8, 0x00000290, 0x000002c8,
+ 0x000002b8, 0x000002d0, 0x000002b0, 0x00000280,
+ 0x000002c0, 0x000002e0, 0x000002a0, 0x000002a8,
+ 0x000002f8, 0x00000298, 0x000002d8, 0x000002f0,
+ 0x00000008, 0x00000068, 0x00000010, 0x00000048,
+ 0x00000038, 0x00000050, 0x00000030, 0x00000000,
+ 0x00000040, 0x00000060, 0x00000020, 0x00000028,
+ 0x00000078, 0x00000018, 0x00000058, 0x00000070,
+ 0x00000608, 0x00000668, 0x00000610, 0x00000648,
+ 0x00000638, 0x00000650, 0x00000630, 0x00000600,
+ 0x00000640, 0x00000660, 0x00000620, 0x00000628,
+ 0x00000678, 0x00000618, 0x00000658, 0x00000670,
+ 0x00000708, 0x00000768, 0x00000710, 0x00000748,
+ 0x00000738, 0x00000750, 0x00000730, 0x00000700,
+ 0x00000740, 0x00000760, 0x00000720, 0x00000728,
+ 0x00000778, 0x00000718, 0x00000758, 0x00000770,
+ 0x00000408, 0x00000468, 0x00000410, 0x00000448,
+ 0x00000438, 0x00000450, 0x00000430, 0x00000400,
+ 0x00000440, 0x00000460, 0x00000420, 0x00000428,
+ 0x00000478, 0x00000418, 0x00000458, 0x00000470,
+ 0x00000308, 0x00000368, 0x00000310, 0x00000348,
+ 0x00000338, 0x00000350, 0x00000330, 0x00000300,
+ 0x00000340, 0x00000360, 0x00000320, 0x00000328,
+ 0x00000378, 0x00000318, 0x00000358, 0x00000370,
+ 0x00000108, 0x00000168, 0x00000110, 0x00000148,
+ 0x00000138, 0x00000150, 0x00000130, 0x00000100,
+ 0x00000140, 0x00000160, 0x00000120, 0x00000128,
+ 0x00000178, 0x00000118, 0x00000158, 0x00000170,
+ 0x00000188, 0x000001e8, 0x00000190, 0x000001c8,
+ 0x000001b8, 0x000001d0, 0x000001b0, 0x00000180,
+ 0x000001c0, 0x000001e0, 0x000001a0, 0x000001a8,
+ 0x000001f8, 0x00000198, 0x000001d8, 0x000001f0,
+ 0x00000488, 0x000004e8, 0x00000490, 0x000004c8,
+ 0x000004b8, 0x000004d0, 0x000004b0, 0x00000480,
+ 0x000004c0, 0x000004e0, 0x000004a0, 0x000004a8,
+ 0x000004f8, 0x00000498, 0x000004d8, 0x000004f0,
+ 0x00000088, 0x000000e8, 0x00000090, 0x000000c8,
+ 0x000000b8, 0x000000d0, 0x000000b0, 0x00000080,
+ 0x000000c0, 0x000000e0, 0x000000a0, 0x000000a8,
+ 0x000000f8, 0x00000098, 0x000000d8, 0x000000f0,
+ 0x00000388, 0x000003e8, 0x00000390, 0x000003c8,
+ 0x000003b8, 0x000003d0, 0x000003b0, 0x00000380,
+ 0x000003c0, 0x000003e0, 0x000003a0, 0x000003a8,
+ 0x000003f8, 0x00000398, 0x000003d8, 0x000003f0,
+ 0x00000688, 0x000006e8, 0x00000690, 0x000006c8,
+ 0x000006b8, 0x000006d0, 0x000006b0, 0x00000680,
+ 0x000006c0, 0x000006e0, 0x000006a0, 0x000006a8,
+ 0x000006f8, 0x00000698, 0x000006d8, 0x000006f0,
+ 0x00000208, 0x00000268, 0x00000210, 0x00000248,
+ 0x00000238, 0x00000250, 0x00000230, 0x00000200,
+ 0x00000240, 0x00000260, 0x00000220, 0x00000228,
+ 0x00000278, 0x00000218, 0x00000258, 0x00000270,
+ }
+};
+
+const struct gost28147_param gost28147_param_CryptoPro_B =
+{
+ 1,
+ {
+ /* 0 */
+ 0x00004000, 0x00002000, 0x00005800, 0x00000800,
+ 0x00001800, 0x00002800, 0x00000000, 0x00004800,
+ 0x00001000, 0x00007000, 0x00005000, 0x00006000,
+ 0x00006800, 0x00003000, 0x00003800, 0x00007800,
+ 0x0000c000, 0x0000a000, 0x0000d800, 0x00008800,
+ 0x00009800, 0x0000a800, 0x00008000, 0x0000c800,
+ 0x00009000, 0x0000f000, 0x0000d000, 0x0000e000,
+ 0x0000e800, 0x0000b000, 0x0000b800, 0x0000f800,
+ 0x00014000, 0x00012000, 0x00015800, 0x00010800,
+ 0x00011800, 0x00012800, 0x00010000, 0x00014800,
+ 0x00011000, 0x00017000, 0x00015000, 0x00016000,
+ 0x00016800, 0x00013000, 0x00013800, 0x00017800,
+ 0x00054000, 0x00052000, 0x00055800, 0x00050800,
+ 0x00051800, 0x00052800, 0x00050000, 0x00054800,
+ 0x00051000, 0x00057000, 0x00055000, 0x00056000,
+ 0x00056800, 0x00053000, 0x00053800, 0x00057800,
+ 0x00024000, 0x00022000, 0x00025800, 0x00020800,
+ 0x00021800, 0x00022800, 0x00020000, 0x00024800,
+ 0x00021000, 0x00027000, 0x00025000, 0x00026000,
+ 0x00026800, 0x00023000, 0x00023800, 0x00027800,
+ 0x0006c000, 0x0006a000, 0x0006d800, 0x00068800,
+ 0x00069800, 0x0006a800, 0x00068000, 0x0006c800,
+ 0x00069000, 0x0006f000, 0x0006d000, 0x0006e000,
+ 0x0006e800, 0x0006b000, 0x0006b800, 0x0006f800,
+ 0x0002c000, 0x0002a000, 0x0002d800, 0x00028800,
+ 0x00029800, 0x0002a800, 0x00028000, 0x0002c800,
+ 0x00029000, 0x0002f000, 0x0002d000, 0x0002e000,
+ 0x0002e800, 0x0002b000, 0x0002b800, 0x0002f800,
+ 0x00064000, 0x00062000, 0x00065800, 0x00060800,
+ 0x00061800, 0x00062800, 0x00060000, 0x00064800,
+ 0x00061000, 0x00067000, 0x00065000, 0x00066000,
+ 0x00066800, 0x00063000, 0x00063800, 0x00067800,
+ 0x0004c000, 0x0004a000, 0x0004d800, 0x00048800,
+ 0x00049800, 0x0004a800, 0x00048000, 0x0004c800,
+ 0x00049000, 0x0004f000, 0x0004d000, 0x0004e000,
+ 0x0004e800, 0x0004b000, 0x0004b800, 0x0004f800,
+ 0x0003c000, 0x0003a000, 0x0003d800, 0x00038800,
+ 0x00039800, 0x0003a800, 0x00038000, 0x0003c800,
+ 0x00039000, 0x0003f000, 0x0003d000, 0x0003e000,
+ 0x0003e800, 0x0003b000, 0x0003b800, 0x0003f800,
+ 0x0001c000, 0x0001a000, 0x0001d800, 0x00018800,
+ 0x00019800, 0x0001a800, 0x00018000, 0x0001c800,
+ 0x00019000, 0x0001f000, 0x0001d000, 0x0001e000,
+ 0x0001e800, 0x0001b000, 0x0001b800, 0x0001f800,
+ 0x0007c000, 0x0007a000, 0x0007d800, 0x00078800,
+ 0x00079800, 0x0007a800, 0x00078000, 0x0007c800,
+ 0x00079000, 0x0007f000, 0x0007d000, 0x0007e000,
+ 0x0007e800, 0x0007b000, 0x0007b800, 0x0007f800,
+ 0x0005c000, 0x0005a000, 0x0005d800, 0x00058800,
+ 0x00059800, 0x0005a800, 0x00058000, 0x0005c800,
+ 0x00059000, 0x0005f000, 0x0005d000, 0x0005e000,
+ 0x0005e800, 0x0005b000, 0x0005b800, 0x0005f800,
+ 0x00044000, 0x00042000, 0x00045800, 0x00040800,
+ 0x00041800, 0x00042800, 0x00040000, 0x00044800,
+ 0x00041000, 0x00047000, 0x00045000, 0x00046000,
+ 0x00046800, 0x00043000, 0x00043800, 0x00047800,
+ 0x00034000, 0x00032000, 0x00035800, 0x00030800,
+ 0x00031800, 0x00032800, 0x00030000, 0x00034800,
+ 0x00031000, 0x00037000, 0x00035000, 0x00036000,
+ 0x00036800, 0x00033000, 0x00033800, 0x00037800,
+ 0x00074000, 0x00072000, 0x00075800, 0x00070800,
+ 0x00071800, 0x00072800, 0x00070000, 0x00074800,
+ 0x00071000, 0x00077000, 0x00075000, 0x00076000,
+ 0x00076800, 0x00073000, 0x00073800, 0x00077800,
+ /* 1 */
+ 0x03f00000, 0x03e00000, 0x03800000, 0x03d00000,
+ 0x03c80000, 0x03900000, 0x03e80000, 0x03d80000,
+ 0x03b80000, 0x03a80000, 0x03c00000, 0x03f80000,
+ 0x03980000, 0x03b00000, 0x03880000, 0x03a00000,
+ 0x02f00000, 0x02e00000, 0x02800000, 0x02d00000,
+ 0x02c80000, 0x02900000, 0x02e80000, 0x02d80000,
+ 0x02b80000, 0x02a80000, 0x02c00000, 0x02f80000,
+ 0x02980000, 0x02b00000, 0x02880000, 0x02a00000,
+ 0x00700000, 0x00600000, 0x00000000, 0x00500000,
+ 0x00480000, 0x00100000, 0x00680000, 0x00580000,
+ 0x00380000, 0x00280000, 0x00400000, 0x00780000,
+ 0x00180000, 0x00300000, 0x00080000, 0x00200000,
+ 0x06f00000, 0x06e00000, 0x06800000, 0x06d00000,
+ 0x06c80000, 0x06900000, 0x06e80000, 0x06d80000,
+ 0x06b80000, 0x06a80000, 0x06c00000, 0x06f80000,
+ 0x06980000, 0x06b00000, 0x06880000, 0x06a00000,
+ 0x05f00000, 0x05e00000, 0x05800000, 0x05d00000,
+ 0x05c80000, 0x05900000, 0x05e80000, 0x05d80000,
+ 0x05b80000, 0x05a80000, 0x05c00000, 0x05f80000,
+ 0x05980000, 0x05b00000, 0x05880000, 0x05a00000,
+ 0x03700000, 0x03600000, 0x03000000, 0x03500000,
+ 0x03480000, 0x03100000, 0x03680000, 0x03580000,
+ 0x03380000, 0x03280000, 0x03400000, 0x03780000,
+ 0x03180000, 0x03300000, 0x03080000, 0x03200000,
+ 0x00f00000, 0x00e00000, 0x00800000, 0x00d00000,
+ 0x00c80000, 0x00900000, 0x00e80000, 0x00d80000,
+ 0x00b80000, 0x00a80000, 0x00c00000, 0x00f80000,
+ 0x00980000, 0x00b00000, 0x00880000, 0x00a00000,
+ 0x01700000, 0x01600000, 0x01000000, 0x01500000,
+ 0x01480000, 0x01100000, 0x01680000, 0x01580000,
+ 0x01380000, 0x01280000, 0x01400000, 0x01780000,
+ 0x01180000, 0x01300000, 0x01080000, 0x01200000,
+ 0x01f00000, 0x01e00000, 0x01800000, 0x01d00000,
+ 0x01c80000, 0x01900000, 0x01e80000, 0x01d80000,
+ 0x01b80000, 0x01a80000, 0x01c00000, 0x01f80000,
+ 0x01980000, 0x01b00000, 0x01880000, 0x01a00000,
+ 0x05700000, 0x05600000, 0x05000000, 0x05500000,
+ 0x05480000, 0x05100000, 0x05680000, 0x05580000,
+ 0x05380000, 0x05280000, 0x05400000, 0x05780000,
+ 0x05180000, 0x05300000, 0x05080000, 0x05200000,
+ 0x06700000, 0x06600000, 0x06000000, 0x06500000,
+ 0x06480000, 0x06100000, 0x06680000, 0x06580000,
+ 0x06380000, 0x06280000, 0x06400000, 0x06780000,
+ 0x06180000, 0x06300000, 0x06080000, 0x06200000,
+ 0x07f00000, 0x07e00000, 0x07800000, 0x07d00000,
+ 0x07c80000, 0x07900000, 0x07e80000, 0x07d80000,
+ 0x07b80000, 0x07a80000, 0x07c00000, 0x07f80000,
+ 0x07980000, 0x07b00000, 0x07880000, 0x07a00000,
+ 0x02700000, 0x02600000, 0x02000000, 0x02500000,
+ 0x02480000, 0x02100000, 0x02680000, 0x02580000,
+ 0x02380000, 0x02280000, 0x02400000, 0x02780000,
+ 0x02180000, 0x02300000, 0x02080000, 0x02200000,
+ 0x07700000, 0x07600000, 0x07000000, 0x07500000,
+ 0x07480000, 0x07100000, 0x07680000, 0x07580000,
+ 0x07380000, 0x07280000, 0x07400000, 0x07780000,
+ 0x07180000, 0x07300000, 0x07080000, 0x07200000,
+ 0x04f00000, 0x04e00000, 0x04800000, 0x04d00000,
+ 0x04c80000, 0x04900000, 0x04e80000, 0x04d80000,
+ 0x04b80000, 0x04a80000, 0x04c00000, 0x04f80000,
+ 0x04980000, 0x04b00000, 0x04880000, 0x04a00000,
+ 0x04700000, 0x04600000, 0x04000000, 0x04500000,
+ 0x04480000, 0x04100000, 0x04680000, 0x04580000,
+ 0x04380000, 0x04280000, 0x04400000, 0x04780000,
+ 0x04180000, 0x04300000, 0x04080000, 0x04200000,
+ /* 2 */
+ 0x10000004, 0x38000004, 0x60000004, 0x78000004,
+ 0x48000004, 0x28000004, 0x50000004, 0x58000004,
+ 0x08000004, 0x20000004, 0x00000004, 0x68000004,
+ 0x30000004, 0x40000004, 0x70000004, 0x18000004,
+ 0x90000001, 0xb8000001, 0xe0000001, 0xf8000001,
+ 0xc8000001, 0xa8000001, 0xd0000001, 0xd8000001,
+ 0x88000001, 0xa0000001, 0x80000001, 0xe8000001,
+ 0xb0000001, 0xc0000001, 0xf0000001, 0x98000001,
+ 0x10000001, 0x38000001, 0x60000001, 0x78000001,
+ 0x48000001, 0x28000001, 0x50000001, 0x58000001,
+ 0x08000001, 0x20000001, 0x00000001, 0x68000001,
+ 0x30000001, 0x40000001, 0x70000001, 0x18000001,
+ 0x10000003, 0x38000003, 0x60000003, 0x78000003,
+ 0x48000003, 0x28000003, 0x50000003, 0x58000003,
+ 0x08000003, 0x20000003, 0x00000003, 0x68000003,
+ 0x30000003, 0x40000003, 0x70000003, 0x18000003,
+ 0x10000002, 0x38000002, 0x60000002, 0x78000002,
+ 0x48000002, 0x28000002, 0x50000002, 0x58000002,
+ 0x08000002, 0x20000002, 0x00000002, 0x68000002,
+ 0x30000002, 0x40000002, 0x70000002, 0x18000002,
+ 0x90000006, 0xb8000006, 0xe0000006, 0xf8000006,
+ 0xc8000006, 0xa8000006, 0xd0000006, 0xd8000006,
+ 0x88000006, 0xa0000006, 0x80000006, 0xe8000006,
+ 0xb0000006, 0xc0000006, 0xf0000006, 0x98000006,
+ 0x10000007, 0x38000007, 0x60000007, 0x78000007,
+ 0x48000007, 0x28000007, 0x50000007, 0x58000007,
+ 0x08000007, 0x20000007, 0x00000007, 0x68000007,
+ 0x30000007, 0x40000007, 0x70000007, 0x18000007,
+ 0x90000005, 0xb8000005, 0xe0000005, 0xf8000005,
+ 0xc8000005, 0xa8000005, 0xd0000005, 0xd8000005,
+ 0x88000005, 0xa0000005, 0x80000005, 0xe8000005,
+ 0xb0000005, 0xc0000005, 0xf0000005, 0x98000005,
+ 0x10000006, 0x38000006, 0x60000006, 0x78000006,
+ 0x48000006, 0x28000006, 0x50000006, 0x58000006,
+ 0x08000006, 0x20000006, 0x00000006, 0x68000006,
+ 0x30000006, 0x40000006, 0x70000006, 0x18000006,
+ 0x90000000, 0xb8000000, 0xe0000000, 0xf8000000,
+ 0xc8000000, 0xa8000000, 0xd0000000, 0xd8000000,
+ 0x88000000, 0xa0000000, 0x80000000, 0xe8000000,
+ 0xb0000000, 0xc0000000, 0xf0000000, 0x98000000,
+ 0x90000003, 0xb8000003, 0xe0000003, 0xf8000003,
+ 0xc8000003, 0xa8000003, 0xd0000003, 0xd8000003,
+ 0x88000003, 0xa0000003, 0x80000003, 0xe8000003,
+ 0xb0000003, 0xc0000003, 0xf0000003, 0x98000003,
+ 0x90000007, 0xb8000007, 0xe0000007, 0xf8000007,
+ 0xc8000007, 0xa8000007, 0xd0000007, 0xd8000007,
+ 0x88000007, 0xa0000007, 0x80000007, 0xe8000007,
+ 0xb0000007, 0xc0000007, 0xf0000007, 0x98000007,
+ 0x10000005, 0x38000005, 0x60000005, 0x78000005,
+ 0x48000005, 0x28000005, 0x50000005, 0x58000005,
+ 0x08000005, 0x20000005, 0x00000005, 0x68000005,
+ 0x30000005, 0x40000005, 0x70000005, 0x18000005,
+ 0x10000000, 0x38000000, 0x60000000, 0x78000000,
+ 0x48000000, 0x28000000, 0x50000000, 0x58000000,
+ 0x08000000, 0x20000000, 0x00000000, 0x68000000,
+ 0x30000000, 0x40000000, 0x70000000, 0x18000000,
+ 0x90000004, 0xb8000004, 0xe0000004, 0xf8000004,
+ 0xc8000004, 0xa8000004, 0xd0000004, 0xd8000004,
+ 0x88000004, 0xa0000004, 0x80000004, 0xe8000004,
+ 0xb0000004, 0xc0000004, 0xf0000004, 0x98000004,
+ 0x90000002, 0xb8000002, 0xe0000002, 0xf8000002,
+ 0xc8000002, 0xa8000002, 0xd0000002, 0xd8000002,
+ 0x88000002, 0xa0000002, 0x80000002, 0xe8000002,
+ 0xb0000002, 0xc0000002, 0xf0000002, 0x98000002,
+ /* 3 */
+ 0x00000028, 0x00000010, 0x00000050, 0x00000058,
+ 0x00000048, 0x00000008, 0x00000060, 0x00000018,
+ 0x00000038, 0x00000020, 0x00000068, 0x00000000,
+ 0x00000030, 0x00000078, 0x00000040, 0x00000070,
+ 0x00000228, 0x00000210, 0x00000250, 0x00000258,
+ 0x00000248, 0x00000208, 0x00000260, 0x00000218,
+ 0x00000238, 0x00000220, 0x00000268, 0x00000200,
+ 0x00000230, 0x00000278, 0x00000240, 0x00000270,
+ 0x000005a8, 0x00000590, 0x000005d0, 0x000005d8,
+ 0x000005c8, 0x00000588, 0x000005e0, 0x00000598,
+ 0x000005b8, 0x000005a0, 0x000005e8, 0x00000580,
+ 0x000005b0, 0x000005f8, 0x000005c0, 0x000005f0,
+ 0x00000728, 0x00000710, 0x00000750, 0x00000758,
+ 0x00000748, 0x00000708, 0x00000760, 0x00000718,
+ 0x00000738, 0x00000720, 0x00000768, 0x00000700,
+ 0x00000730, 0x00000778, 0x00000740, 0x00000770,
+ 0x00000428, 0x00000410, 0x00000450, 0x00000458,
+ 0x00000448, 0x00000408, 0x00000460, 0x00000418,
+ 0x00000438, 0x00000420, 0x00000468, 0x00000400,
+ 0x00000430, 0x00000478, 0x00000440, 0x00000470,
+ 0x000001a8, 0x00000190, 0x000001d0, 0x000001d8,
+ 0x000001c8, 0x00000188, 0x000001e0, 0x00000198,
+ 0x000001b8, 0x000001a0, 0x000001e8, 0x00000180,
+ 0x000001b0, 0x000001f8, 0x000001c0, 0x000001f0,
+ 0x000003a8, 0x00000390, 0x000003d0, 0x000003d8,
+ 0x000003c8, 0x00000388, 0x000003e0, 0x00000398,
+ 0x000003b8, 0x000003a0, 0x000003e8, 0x00000380,
+ 0x000003b0, 0x000003f8, 0x000003c0, 0x000003f0,
+ 0x000000a8, 0x00000090, 0x000000d0, 0x000000d8,
+ 0x000000c8, 0x00000088, 0x000000e0, 0x00000098,
+ 0x000000b8, 0x000000a0, 0x000000e8, 0x00000080,
+ 0x000000b0, 0x000000f8, 0x000000c0, 0x000000f0,
+ 0x00000528, 0x00000510, 0x00000550, 0x00000558,
+ 0x00000548, 0x00000508, 0x00000560, 0x00000518,
+ 0x00000538, 0x00000520, 0x00000568, 0x00000500,
+ 0x00000530, 0x00000578, 0x00000540, 0x00000570,
+ 0x00000128, 0x00000110, 0x00000150, 0x00000158,
+ 0x00000148, 0x00000108, 0x00000160, 0x00000118,
+ 0x00000138, 0x00000120, 0x00000168, 0x00000100,
+ 0x00000130, 0x00000178, 0x00000140, 0x00000170,
+ 0x000004a8, 0x00000490, 0x000004d0, 0x000004d8,
+ 0x000004c8, 0x00000488, 0x000004e0, 0x00000498,
+ 0x000004b8, 0x000004a0, 0x000004e8, 0x00000480,
+ 0x000004b0, 0x000004f8, 0x000004c0, 0x000004f0,
+ 0x00000328, 0x00000310, 0x00000350, 0x00000358,
+ 0x00000348, 0x00000308, 0x00000360, 0x00000318,
+ 0x00000338, 0x00000320, 0x00000368, 0x00000300,
+ 0x00000330, 0x00000378, 0x00000340, 0x00000370,
+ 0x000007a8, 0x00000790, 0x000007d0, 0x000007d8,
+ 0x000007c8, 0x00000788, 0x000007e0, 0x00000798,
+ 0x000007b8, 0x000007a0, 0x000007e8, 0x00000780,
+ 0x000007b0, 0x000007f8, 0x000007c0, 0x000007f0,
+ 0x000006a8, 0x00000690, 0x000006d0, 0x000006d8,
+ 0x000006c8, 0x00000688, 0x000006e0, 0x00000698,
+ 0x000006b8, 0x000006a0, 0x000006e8, 0x00000680,
+ 0x000006b0, 0x000006f8, 0x000006c0, 0x000006f0,
+ 0x000002a8, 0x00000290, 0x000002d0, 0x000002d8,
+ 0x000002c8, 0x00000288, 0x000002e0, 0x00000298,
+ 0x000002b8, 0x000002a0, 0x000002e8, 0x00000280,
+ 0x000002b0, 0x000002f8, 0x000002c0, 0x000002f0,
+ 0x00000628, 0x00000610, 0x00000650, 0x00000658,
+ 0x00000648, 0x00000608, 0x00000660, 0x00000618,
+ 0x00000638, 0x00000620, 0x00000668, 0x00000600,
+ 0x00000630, 0x00000678, 0x00000640, 0x00000670,
+ }
+};
+
+const struct gost28147_param gost28147_param_CryptoPro_C =
+{
+ 1,
+ {
+ /* 0 */
+ 0x00000800, 0x00005800, 0x00006000, 0x00001000,
+ 0x00004800, 0x00006800, 0x00000000, 0x00007800,
+ 0x00002000, 0x00002800, 0x00004000, 0x00007000,
+ 0x00005000, 0x00003800, 0x00003000, 0x00001800,
+ 0x00008800, 0x0000d800, 0x0000e000, 0x00009000,
+ 0x0000c800, 0x0000e800, 0x00008000, 0x0000f800,
+ 0x0000a000, 0x0000a800, 0x0000c000, 0x0000f000,
+ 0x0000d000, 0x0000b800, 0x0000b000, 0x00009800,
+ 0x00038800, 0x0003d800, 0x0003e000, 0x00039000,
+ 0x0003c800, 0x0003e800, 0x00038000, 0x0003f800,
+ 0x0003a000, 0x0003a800, 0x0003c000, 0x0003f000,
+ 0x0003d000, 0x0003b800, 0x0003b000, 0x00039800,
+ 0x00068800, 0x0006d800, 0x0006e000, 0x00069000,
+ 0x0006c800, 0x0006e800, 0x00068000, 0x0006f800,
+ 0x0006a000, 0x0006a800, 0x0006c000, 0x0006f000,
+ 0x0006d000, 0x0006b800, 0x0006b000, 0x00069800,
+ 0x00058800, 0x0005d800, 0x0005e000, 0x00059000,
+ 0x0005c800, 0x0005e800, 0x00058000, 0x0005f800,
+ 0x0005a000, 0x0005a800, 0x0005c000, 0x0005f000,
+ 0x0005d000, 0x0005b800, 0x0005b000, 0x00059800,
+ 0x00020800, 0x00025800, 0x00026000, 0x00021000,
+ 0x00024800, 0x00026800, 0x00020000, 0x00027800,
+ 0x00022000, 0x00022800, 0x00024000, 0x00027000,
+ 0x00025000, 0x00023800, 0x00023000, 0x00021800,
+ 0x00028800, 0x0002d800, 0x0002e000, 0x00029000,
+ 0x0002c800, 0x0002e800, 0x00028000, 0x0002f800,
+ 0x0002a000, 0x0002a800, 0x0002c000, 0x0002f000,
+ 0x0002d000, 0x0002b800, 0x0002b000, 0x00029800,
+ 0x00010800, 0x00015800, 0x00016000, 0x00011000,
+ 0x00014800, 0x00016800, 0x00010000, 0x00017800,
+ 0x00012000, 0x00012800, 0x00014000, 0x00017000,
+ 0x00015000, 0x00013800, 0x00013000, 0x00011800,
+ 0x00040800, 0x00045800, 0x00046000, 0x00041000,
+ 0x00044800, 0x00046800, 0x00040000, 0x00047800,
+ 0x00042000, 0x00042800, 0x00044000, 0x00047000,
+ 0x00045000, 0x00043800, 0x00043000, 0x00041800,
+ 0x00070800, 0x00075800, 0x00076000, 0x00071000,
+ 0x00074800, 0x00076800, 0x00070000, 0x00077800,
+ 0x00072000, 0x00072800, 0x00074000, 0x00077000,
+ 0x00075000, 0x00073800, 0x00073000, 0x00071800,
+ 0x00078800, 0x0007d800, 0x0007e000, 0x00079000,
+ 0x0007c800, 0x0007e800, 0x00078000, 0x0007f800,
+ 0x0007a000, 0x0007a800, 0x0007c000, 0x0007f000,
+ 0x0007d000, 0x0007b800, 0x0007b000, 0x00079800,
+ 0x00060800, 0x00065800, 0x00066000, 0x00061000,
+ 0x00064800, 0x00066800, 0x00060000, 0x00067800,
+ 0x00062000, 0x00062800, 0x00064000, 0x00067000,
+ 0x00065000, 0x00063800, 0x00063000, 0x00061800,
+ 0x00048800, 0x0004d800, 0x0004e000, 0x00049000,
+ 0x0004c800, 0x0004e800, 0x00048000, 0x0004f800,
+ 0x0004a000, 0x0004a800, 0x0004c000, 0x0004f000,
+ 0x0004d000, 0x0004b800, 0x0004b000, 0x00049800,
+ 0x00050800, 0x00055800, 0x00056000, 0x00051000,
+ 0x00054800, 0x00056800, 0x00050000, 0x00057800,
+ 0x00052000, 0x00052800, 0x00054000, 0x00057000,
+ 0x00055000, 0x00053800, 0x00053000, 0x00051800,
+ 0x00030800, 0x00035800, 0x00036000, 0x00031000,
+ 0x00034800, 0x00036800, 0x00030000, 0x00037800,
+ 0x00032000, 0x00032800, 0x00034000, 0x00037000,
+ 0x00035000, 0x00033800, 0x00033000, 0x00031800,
+ 0x00018800, 0x0001d800, 0x0001e000, 0x00019000,
+ 0x0001c800, 0x0001e800, 0x00018000, 0x0001f800,
+ 0x0001a000, 0x0001a800, 0x0001c000, 0x0001f000,
+ 0x0001d000, 0x0001b800, 0x0001b000, 0x00019800,
+ /* 1 */
+ 0x01c00000, 0x01900000, 0x01a80000, 0x01800000,
+ 0x01a00000, 0x01c80000, 0x01f80000, 0x01d00000,
+ 0x01980000, 0x01b80000, 0x01e00000, 0x01e80000,
+ 0x01b00000, 0x01f00000, 0x01880000, 0x01d80000,
+ 0x03400000, 0x03100000, 0x03280000, 0x03000000,
+ 0x03200000, 0x03480000, 0x03780000, 0x03500000,
+ 0x03180000, 0x03380000, 0x03600000, 0x03680000,
+ 0x03300000, 0x03700000, 0x03080000, 0x03580000,
+ 0x00400000, 0x00100000, 0x00280000, 0x00000000,
+ 0x00200000, 0x00480000, 0x00780000, 0x00500000,
+ 0x00180000, 0x00380000, 0x00600000, 0x00680000,
+ 0x00300000, 0x00700000, 0x00080000, 0x00580000,
+ 0x00c00000, 0x00900000, 0x00a80000, 0x00800000,
+ 0x00a00000, 0x00c80000, 0x00f80000, 0x00d00000,
+ 0x00980000, 0x00b80000, 0x00e00000, 0x00e80000,
+ 0x00b00000, 0x00f00000, 0x00880000, 0x00d80000,
+ 0x02c00000, 0x02900000, 0x02a80000, 0x02800000,
+ 0x02a00000, 0x02c80000, 0x02f80000, 0x02d00000,
+ 0x02980000, 0x02b80000, 0x02e00000, 0x02e80000,
+ 0x02b00000, 0x02f00000, 0x02880000, 0x02d80000,
+ 0x06c00000, 0x06900000, 0x06a80000, 0x06800000,
+ 0x06a00000, 0x06c80000, 0x06f80000, 0x06d00000,
+ 0x06980000, 0x06b80000, 0x06e00000, 0x06e80000,
+ 0x06b00000, 0x06f00000, 0x06880000, 0x06d80000,
+ 0x05400000, 0x05100000, 0x05280000, 0x05000000,
+ 0x05200000, 0x05480000, 0x05780000, 0x05500000,
+ 0x05180000, 0x05380000, 0x05600000, 0x05680000,
+ 0x05300000, 0x05700000, 0x05080000, 0x05580000,
+ 0x04400000, 0x04100000, 0x04280000, 0x04000000,
+ 0x04200000, 0x04480000, 0x04780000, 0x04500000,
+ 0x04180000, 0x04380000, 0x04600000, 0x04680000,
+ 0x04300000, 0x04700000, 0x04080000, 0x04580000,
+ 0x05c00000, 0x05900000, 0x05a80000, 0x05800000,
+ 0x05a00000, 0x05c80000, 0x05f80000, 0x05d00000,
+ 0x05980000, 0x05b80000, 0x05e00000, 0x05e80000,
+ 0x05b00000, 0x05f00000, 0x05880000, 0x05d80000,
+ 0x01400000, 0x01100000, 0x01280000, 0x01000000,
+ 0x01200000, 0x01480000, 0x01780000, 0x01500000,
+ 0x01180000, 0x01380000, 0x01600000, 0x01680000,
+ 0x01300000, 0x01700000, 0x01080000, 0x01580000,
+ 0x04c00000, 0x04900000, 0x04a80000, 0x04800000,
+ 0x04a00000, 0x04c80000, 0x04f80000, 0x04d00000,
+ 0x04980000, 0x04b80000, 0x04e00000, 0x04e80000,
+ 0x04b00000, 0x04f00000, 0x04880000, 0x04d80000,
+ 0x03c00000, 0x03900000, 0x03a80000, 0x03800000,
+ 0x03a00000, 0x03c80000, 0x03f80000, 0x03d00000,
+ 0x03980000, 0x03b80000, 0x03e00000, 0x03e80000,
+ 0x03b00000, 0x03f00000, 0x03880000, 0x03d80000,
+ 0x07400000, 0x07100000, 0x07280000, 0x07000000,
+ 0x07200000, 0x07480000, 0x07780000, 0x07500000,
+ 0x07180000, 0x07380000, 0x07600000, 0x07680000,
+ 0x07300000, 0x07700000, 0x07080000, 0x07580000,
+ 0x07c00000, 0x07900000, 0x07a80000, 0x07800000,
+ 0x07a00000, 0x07c80000, 0x07f80000, 0x07d00000,
+ 0x07980000, 0x07b80000, 0x07e00000, 0x07e80000,
+ 0x07b00000, 0x07f00000, 0x07880000, 0x07d80000,
+ 0x06400000, 0x06100000, 0x06280000, 0x06000000,
+ 0x06200000, 0x06480000, 0x06780000, 0x06500000,
+ 0x06180000, 0x06380000, 0x06600000, 0x06680000,
+ 0x06300000, 0x06700000, 0x06080000, 0x06580000,
+ 0x02400000, 0x02100000, 0x02280000, 0x02000000,
+ 0x02200000, 0x02480000, 0x02780000, 0x02500000,
+ 0x02180000, 0x02380000, 0x02600000, 0x02680000,
+ 0x02300000, 0x02700000, 0x02080000, 0x02580000,
+ /* 2 */
+ 0x40000006, 0x68000006, 0x58000006, 0x00000006,
+ 0x20000006, 0x28000006, 0x08000006, 0x10000006,
+ 0x48000006, 0x18000006, 0x60000006, 0x70000006,
+ 0x30000006, 0x78000006, 0x50000006, 0x38000006,
+ 0xc0000004, 0xe8000004, 0xd8000004, 0x80000004,
+ 0xa0000004, 0xa8000004, 0x88000004, 0x90000004,
+ 0xc8000004, 0x98000004, 0xe0000004, 0xf0000004,
+ 0xb0000004, 0xf8000004, 0xd0000004, 0xb8000004,
+ 0xc0000005, 0xe8000005, 0xd8000005, 0x80000005,
+ 0xa0000005, 0xa8000005, 0x88000005, 0x90000005,
+ 0xc8000005, 0x98000005, 0xe0000005, 0xf0000005,
+ 0xb0000005, 0xf8000005, 0xd0000005, 0xb8000005,
+ 0xc0000000, 0xe8000000, 0xd8000000, 0x80000000,
+ 0xa0000000, 0xa8000000, 0x88000000, 0x90000000,
+ 0xc8000000, 0x98000000, 0xe0000000, 0xf0000000,
+ 0xb0000000, 0xf8000000, 0xd0000000, 0xb8000000,
+ 0x40000004, 0x68000004, 0x58000004, 0x00000004,
+ 0x20000004, 0x28000004, 0x08000004, 0x10000004,
+ 0x48000004, 0x18000004, 0x60000004, 0x70000004,
+ 0x30000004, 0x78000004, 0x50000004, 0x38000004,
+ 0x40000007, 0x68000007, 0x58000007, 0x00000007,
+ 0x20000007, 0x28000007, 0x08000007, 0x10000007,
+ 0x48000007, 0x18000007, 0x60000007, 0x70000007,
+ 0x30000007, 0x78000007, 0x50000007, 0x38000007,
+ 0x40000001, 0x68000001, 0x58000001, 0x00000001,
+ 0x20000001, 0x28000001, 0x08000001, 0x10000001,
+ 0x48000001, 0x18000001, 0x60000001, 0x70000001,
+ 0x30000001, 0x78000001, 0x50000001, 0x38000001,
+ 0x40000002, 0x68000002, 0x58000002, 0x00000002,
+ 0x20000002, 0x28000002, 0x08000002, 0x10000002,
+ 0x48000002, 0x18000002, 0x60000002, 0x70000002,
+ 0x30000002, 0x78000002, 0x50000002, 0x38000002,
+ 0xc0000003, 0xe8000003, 0xd8000003, 0x80000003,
+ 0xa0000003, 0xa8000003, 0x88000003, 0x90000003,
+ 0xc8000003, 0x98000003, 0xe0000003, 0xf0000003,
+ 0xb0000003, 0xf8000003, 0xd0000003, 0xb8000003,
+ 0xc0000001, 0xe8000001, 0xd8000001, 0x80000001,
+ 0xa0000001, 0xa8000001, 0x88000001, 0x90000001,
+ 0xc8000001, 0x98000001, 0xe0000001, 0xf0000001,
+ 0xb0000001, 0xf8000001, 0xd0000001, 0xb8000001,
+ 0x40000003, 0x68000003, 0x58000003, 0x00000003,
+ 0x20000003, 0x28000003, 0x08000003, 0x10000003,
+ 0x48000003, 0x18000003, 0x60000003, 0x70000003,
+ 0x30000003, 0x78000003, 0x50000003, 0x38000003,
+ 0xc0000002, 0xe8000002, 0xd8000002, 0x80000002,
+ 0xa0000002, 0xa8000002, 0x88000002, 0x90000002,
+ 0xc8000002, 0x98000002, 0xe0000002, 0xf0000002,
+ 0xb0000002, 0xf8000002, 0xd0000002, 0xb8000002,
+ 0x40000005, 0x68000005, 0x58000005, 0x00000005,
+ 0x20000005, 0x28000005, 0x08000005, 0x10000005,
+ 0x48000005, 0x18000005, 0x60000005, 0x70000005,
+ 0x30000005, 0x78000005, 0x50000005, 0x38000005,
+ 0x40000000, 0x68000000, 0x58000000, 0x00000000,
+ 0x20000000, 0x28000000, 0x08000000, 0x10000000,
+ 0x48000000, 0x18000000, 0x60000000, 0x70000000,
+ 0x30000000, 0x78000000, 0x50000000, 0x38000000,
+ 0xc0000007, 0xe8000007, 0xd8000007, 0x80000007,
+ 0xa0000007, 0xa8000007, 0x88000007, 0x90000007,
+ 0xc8000007, 0x98000007, 0xe0000007, 0xf0000007,
+ 0xb0000007, 0xf8000007, 0xd0000007, 0xb8000007,
+ 0xc0000006, 0xe8000006, 0xd8000006, 0x80000006,
+ 0xa0000006, 0xa8000006, 0x88000006, 0x90000006,
+ 0xc8000006, 0x98000006, 0xe0000006, 0xf0000006,
+ 0xb0000006, 0xf8000006, 0xd0000006, 0xb8000006,
+ /* 3 */
+ 0x000003d0, 0x000003c8, 0x000003b0, 0x000003c0,
+ 0x000003e8, 0x000003f0, 0x00000390, 0x00000380,
+ 0x000003f8, 0x00000398, 0x000003a8, 0x000003d8,
+ 0x000003a0, 0x00000388, 0x000003e0, 0x000003b8,
+ 0x00000250, 0x00000248, 0x00000230, 0x00000240,
+ 0x00000268, 0x00000270, 0x00000210, 0x00000200,
+ 0x00000278, 0x00000218, 0x00000228, 0x00000258,
+ 0x00000220, 0x00000208, 0x00000260, 0x00000238,
+ 0x00000050, 0x00000048, 0x00000030, 0x00000040,
+ 0x00000068, 0x00000070, 0x00000010, 0x00000000,
+ 0x00000078, 0x00000018, 0x00000028, 0x00000058,
+ 0x00000020, 0x00000008, 0x00000060, 0x00000038,
+ 0x000002d0, 0x000002c8, 0x000002b0, 0x000002c0,
+ 0x000002e8, 0x000002f0, 0x00000290, 0x00000280,
+ 0x000002f8, 0x00000298, 0x000002a8, 0x000002d8,
+ 0x000002a0, 0x00000288, 0x000002e0, 0x000002b8,
+ 0x00000550, 0x00000548, 0x00000530, 0x00000540,
+ 0x00000568, 0x00000570, 0x00000510, 0x00000500,
+ 0x00000578, 0x00000518, 0x00000528, 0x00000558,
+ 0x00000520, 0x00000508, 0x00000560, 0x00000538,
+ 0x00000150, 0x00000148, 0x00000130, 0x00000140,
+ 0x00000168, 0x00000170, 0x00000110, 0x00000100,
+ 0x00000178, 0x00000118, 0x00000128, 0x00000158,
+ 0x00000120, 0x00000108, 0x00000160, 0x00000138,
+ 0x000007d0, 0x000007c8, 0x000007b0, 0x000007c0,
+ 0x000007e8, 0x000007f0, 0x00000790, 0x00000780,
+ 0x000007f8, 0x00000798, 0x000007a8, 0x000007d8,
+ 0x000007a0, 0x00000788, 0x000007e0, 0x000007b8,
+ 0x00000750, 0x00000748, 0x00000730, 0x00000740,
+ 0x00000768, 0x00000770, 0x00000710, 0x00000700,
+ 0x00000778, 0x00000718, 0x00000728, 0x00000758,
+ 0x00000720, 0x00000708, 0x00000760, 0x00000738,
+ 0x00000650, 0x00000648, 0x00000630, 0x00000640,
+ 0x00000668, 0x00000670, 0x00000610, 0x00000600,
+ 0x00000678, 0x00000618, 0x00000628, 0x00000658,
+ 0x00000620, 0x00000608, 0x00000660, 0x00000638,
+ 0x00000350, 0x00000348, 0x00000330, 0x00000340,
+ 0x00000368, 0x00000370, 0x00000310, 0x00000300,
+ 0x00000378, 0x00000318, 0x00000328, 0x00000358,
+ 0x00000320, 0x00000308, 0x00000360, 0x00000338,
+ 0x000000d0, 0x000000c8, 0x000000b0, 0x000000c0,
+ 0x000000e8, 0x000000f0, 0x00000090, 0x00000080,
+ 0x000000f8, 0x00000098, 0x000000a8, 0x000000d8,
+ 0x000000a0, 0x00000088, 0x000000e0, 0x000000b8,
+ 0x000005d0, 0x000005c8, 0x000005b0, 0x000005c0,
+ 0x000005e8, 0x000005f0, 0x00000590, 0x00000580,
+ 0x000005f8, 0x00000598, 0x000005a8, 0x000005d8,
+ 0x000005a0, 0x00000588, 0x000005e0, 0x000005b8,
+ 0x000006d0, 0x000006c8, 0x000006b0, 0x000006c0,
+ 0x000006e8, 0x000006f0, 0x00000690, 0x00000680,
+ 0x000006f8, 0x00000698, 0x000006a8, 0x000006d8,
+ 0x000006a0, 0x00000688, 0x000006e0, 0x000006b8,
+ 0x000004d0, 0x000004c8, 0x000004b0, 0x000004c0,
+ 0x000004e8, 0x000004f0, 0x00000490, 0x00000480,
+ 0x000004f8, 0x00000498, 0x000004a8, 0x000004d8,
+ 0x000004a0, 0x00000488, 0x000004e0, 0x000004b8,
+ 0x000001d0, 0x000001c8, 0x000001b0, 0x000001c0,
+ 0x000001e8, 0x000001f0, 0x00000190, 0x00000180,
+ 0x000001f8, 0x00000198, 0x000001a8, 0x000001d8,
+ 0x000001a0, 0x00000188, 0x000001e0, 0x000001b8,
+ 0x00000450, 0x00000448, 0x00000430, 0x00000440,
+ 0x00000468, 0x00000470, 0x00000410, 0x00000400,
+ 0x00000478, 0x00000418, 0x00000428, 0x00000458,
+ 0x00000420, 0x00000408, 0x00000460, 0x00000438,
+ }
+};
+
+const struct gost28147_param gost28147_param_CryptoPro_D =
+{
+ 1,
+ {
+ /* 0 */
+ 0x0005f800, 0x0005e000, 0x00059000, 0x0005d000,
+ 0x0005b000, 0x0005a000, 0x0005a800, 0x00058000,
+ 0x0005b800, 0x0005c800, 0x0005f000, 0x0005e800,
+ 0x00058800, 0x0005d800, 0x0005c000, 0x00059800,
+ 0x00037800, 0x00036000, 0x00031000, 0x00035000,
+ 0x00033000, 0x00032000, 0x00032800, 0x00030000,
+ 0x00033800, 0x00034800, 0x00037000, 0x00036800,
+ 0x00030800, 0x00035800, 0x00034000, 0x00031800,
+ 0x0001f800, 0x0001e000, 0x00019000, 0x0001d000,
+ 0x0001b000, 0x0001a000, 0x0001a800, 0x00018000,
+ 0x0001b800, 0x0001c800, 0x0001f000, 0x0001e800,
+ 0x00018800, 0x0001d800, 0x0001c000, 0x00019800,
+ 0x00027800, 0x00026000, 0x00021000, 0x00025000,
+ 0x00023000, 0x00022000, 0x00022800, 0x00020000,
+ 0x00023800, 0x00024800, 0x00027000, 0x00026800,
+ 0x00020800, 0x00025800, 0x00024000, 0x00021800,
+ 0x00067800, 0x00066000, 0x00061000, 0x00065000,
+ 0x00063000, 0x00062000, 0x00062800, 0x00060000,
+ 0x00063800, 0x00064800, 0x00067000, 0x00066800,
+ 0x00060800, 0x00065800, 0x00064000, 0x00061800,
+ 0x0007f800, 0x0007e000, 0x00079000, 0x0007d000,
+ 0x0007b000, 0x0007a000, 0x0007a800, 0x00078000,
+ 0x0007b800, 0x0007c800, 0x0007f000, 0x0007e800,
+ 0x00078800, 0x0007d800, 0x0007c000, 0x00079800,
+ 0x00077800, 0x00076000, 0x00071000, 0x00075000,
+ 0x00073000, 0x00072000, 0x00072800, 0x00070000,
+ 0x00073800, 0x00074800, 0x00077000, 0x00076800,
+ 0x00070800, 0x00075800, 0x00074000, 0x00071800,
+ 0x00017800, 0x00016000, 0x00011000, 0x00015000,
+ 0x00013000, 0x00012000, 0x00012800, 0x00010000,
+ 0x00013800, 0x00014800, 0x00017000, 0x00016800,
+ 0x00010800, 0x00015800, 0x00014000, 0x00011800,
+ 0x0003f800, 0x0003e000, 0x00039000, 0x0003d000,
+ 0x0003b000, 0x0003a000, 0x0003a800, 0x00038000,
+ 0x0003b800, 0x0003c800, 0x0003f000, 0x0003e800,
+ 0x00038800, 0x0003d800, 0x0003c000, 0x00039800,
+ 0x0006f800, 0x0006e000, 0x00069000, 0x0006d000,
+ 0x0006b000, 0x0006a000, 0x0006a800, 0x00068000,
+ 0x0006b800, 0x0006c800, 0x0006f000, 0x0006e800,
+ 0x00068800, 0x0006d800, 0x0006c000, 0x00069800,
+ 0x00047800, 0x00046000, 0x00041000, 0x00045000,
+ 0x00043000, 0x00042000, 0x00042800, 0x00040000,
+ 0x00043800, 0x00044800, 0x00047000, 0x00046800,
+ 0x00040800, 0x00045800, 0x00044000, 0x00041800,
+ 0x00007800, 0x00006000, 0x00001000, 0x00005000,
+ 0x00003000, 0x00002000, 0x00002800, 0x00000000,
+ 0x00003800, 0x00004800, 0x00007000, 0x00006800,
+ 0x00000800, 0x00005800, 0x00004000, 0x00001800,
+ 0x0002f800, 0x0002e000, 0x00029000, 0x0002d000,
+ 0x0002b000, 0x0002a000, 0x0002a800, 0x00028000,
+ 0x0002b800, 0x0002c800, 0x0002f000, 0x0002e800,
+ 0x00028800, 0x0002d800, 0x0002c000, 0x00029800,
+ 0x00057800, 0x00056000, 0x00051000, 0x00055000,
+ 0x00053000, 0x00052000, 0x00052800, 0x00050000,
+ 0x00053800, 0x00054800, 0x00057000, 0x00056800,
+ 0x00050800, 0x00055800, 0x00054000, 0x00051800,
+ 0x0004f800, 0x0004e000, 0x00049000, 0x0004d000,
+ 0x0004b000, 0x0004a000, 0x0004a800, 0x00048000,
+ 0x0004b800, 0x0004c800, 0x0004f000, 0x0004e800,
+ 0x00048800, 0x0004d800, 0x0004c000, 0x00049800,
+ 0x0000f800, 0x0000e000, 0x00009000, 0x0000d000,
+ 0x0000b000, 0x0000a000, 0x0000a800, 0x00008000,
+ 0x0000b800, 0x0000c800, 0x0000f000, 0x0000e800,
+ 0x00008800, 0x0000d800, 0x0000c000, 0x00009800,
+ /* 1 */
+ 0x00880000, 0x00e00000, 0x00d80000, 0x00800000,
+ 0x00f80000, 0x00f00000, 0x00b00000, 0x00a80000,
+ 0x00d00000, 0x00e80000, 0x00a00000, 0x00c00000,
+ 0x00c80000, 0x00980000, 0x00b80000, 0x00900000,
+ 0x02880000, 0x02e00000, 0x02d80000, 0x02800000,
+ 0x02f80000, 0x02f00000, 0x02b00000, 0x02a80000,
+ 0x02d00000, 0x02e80000, 0x02a00000, 0x02c00000,
+ 0x02c80000, 0x02980000, 0x02b80000, 0x02900000,
+ 0x07080000, 0x07600000, 0x07580000, 0x07000000,
+ 0x07780000, 0x07700000, 0x07300000, 0x07280000,
+ 0x07500000, 0x07680000, 0x07200000, 0x07400000,
+ 0x07480000, 0x07180000, 0x07380000, 0x07100000,
+ 0x06080000, 0x06600000, 0x06580000, 0x06000000,
+ 0x06780000, 0x06700000, 0x06300000, 0x06280000,
+ 0x06500000, 0x06680000, 0x06200000, 0x06400000,
+ 0x06480000, 0x06180000, 0x06380000, 0x06100000,
+ 0x05080000, 0x05600000, 0x05580000, 0x05000000,
+ 0x05780000, 0x05700000, 0x05300000, 0x05280000,
+ 0x05500000, 0x05680000, 0x05200000, 0x05400000,
+ 0x05480000, 0x05180000, 0x05380000, 0x05100000,
+ 0x03880000, 0x03e00000, 0x03d80000, 0x03800000,
+ 0x03f80000, 0x03f00000, 0x03b00000, 0x03a80000,
+ 0x03d00000, 0x03e80000, 0x03a00000, 0x03c00000,
+ 0x03c80000, 0x03980000, 0x03b80000, 0x03900000,
+ 0x00080000, 0x00600000, 0x00580000, 0x00000000,
+ 0x00780000, 0x00700000, 0x00300000, 0x00280000,
+ 0x00500000, 0x00680000, 0x00200000, 0x00400000,
+ 0x00480000, 0x00180000, 0x00380000, 0x00100000,
+ 0x06880000, 0x06e00000, 0x06d80000, 0x06800000,
+ 0x06f80000, 0x06f00000, 0x06b00000, 0x06a80000,
+ 0x06d00000, 0x06e80000, 0x06a00000, 0x06c00000,
+ 0x06c80000, 0x06980000, 0x06b80000, 0x06900000,
+ 0x03080000, 0x03600000, 0x03580000, 0x03000000,
+ 0x03780000, 0x03700000, 0x03300000, 0x03280000,
+ 0x03500000, 0x03680000, 0x03200000, 0x03400000,
+ 0x03480000, 0x03180000, 0x03380000, 0x03100000,
+ 0x01080000, 0x01600000, 0x01580000, 0x01000000,
+ 0x01780000, 0x01700000, 0x01300000, 0x01280000,
+ 0x01500000, 0x01680000, 0x01200000, 0x01400000,
+ 0x01480000, 0x01180000, 0x01380000, 0x01100000,
+ 0x05880000, 0x05e00000, 0x05d80000, 0x05800000,
+ 0x05f80000, 0x05f00000, 0x05b00000, 0x05a80000,
+ 0x05d00000, 0x05e80000, 0x05a00000, 0x05c00000,
+ 0x05c80000, 0x05980000, 0x05b80000, 0x05900000,
+ 0x02080000, 0x02600000, 0x02580000, 0x02000000,
+ 0x02780000, 0x02700000, 0x02300000, 0x02280000,
+ 0x02500000, 0x02680000, 0x02200000, 0x02400000,
+ 0x02480000, 0x02180000, 0x02380000, 0x02100000,
+ 0x04880000, 0x04e00000, 0x04d80000, 0x04800000,
+ 0x04f80000, 0x04f00000, 0x04b00000, 0x04a80000,
+ 0x04d00000, 0x04e80000, 0x04a00000, 0x04c00000,
+ 0x04c80000, 0x04980000, 0x04b80000, 0x04900000,
+ 0x01880000, 0x01e00000, 0x01d80000, 0x01800000,
+ 0x01f80000, 0x01f00000, 0x01b00000, 0x01a80000,
+ 0x01d00000, 0x01e80000, 0x01a00000, 0x01c00000,
+ 0x01c80000, 0x01980000, 0x01b80000, 0x01900000,
+ 0x07880000, 0x07e00000, 0x07d80000, 0x07800000,
+ 0x07f80000, 0x07f00000, 0x07b00000, 0x07a80000,
+ 0x07d00000, 0x07e80000, 0x07a00000, 0x07c00000,
+ 0x07c80000, 0x07980000, 0x07b80000, 0x07900000,
+ 0x04080000, 0x04600000, 0x04580000, 0x04000000,
+ 0x04780000, 0x04700000, 0x04300000, 0x04280000,
+ 0x04500000, 0x04680000, 0x04200000, 0x04400000,
+ 0x04480000, 0x04180000, 0x04380000, 0x04100000,
+ /* 2 */
+ 0x00000004, 0x60000004, 0x40000004, 0x48000004,
+ 0x68000004, 0x10000004, 0x50000004, 0x58000004,
+ 0x38000004, 0x18000004, 0x30000004, 0x28000004,
+ 0x20000004, 0x70000004, 0x78000004, 0x08000004,
+ 0x00000000, 0x60000000, 0x40000000, 0x48000000,
+ 0x68000000, 0x10000000, 0x50000000, 0x58000000,
+ 0x38000000, 0x18000000, 0x30000000, 0x28000000,
+ 0x20000000, 0x70000000, 0x78000000, 0x08000000,
+ 0x80000007, 0xe0000007, 0xc0000007, 0xc8000007,
+ 0xe8000007, 0x90000007, 0xd0000007, 0xd8000007,
+ 0xb8000007, 0x98000007, 0xb0000007, 0xa8000007,
+ 0xa0000007, 0xf0000007, 0xf8000007, 0x88000007,
+ 0x80000001, 0xe0000001, 0xc0000001, 0xc8000001,
+ 0xe8000001, 0x90000001, 0xd0000001, 0xd8000001,
+ 0xb8000001, 0x98000001, 0xb0000001, 0xa8000001,
+ 0xa0000001, 0xf0000001, 0xf8000001, 0x88000001,
+ 0x00000001, 0x60000001, 0x40000001, 0x48000001,
+ 0x68000001, 0x10000001, 0x50000001, 0x58000001,
+ 0x38000001, 0x18000001, 0x30000001, 0x28000001,
+ 0x20000001, 0x70000001, 0x78000001, 0x08000001,
+ 0x80000002, 0xe0000002, 0xc0000002, 0xc8000002,
+ 0xe8000002, 0x90000002, 0xd0000002, 0xd8000002,
+ 0xb8000002, 0x98000002, 0xb0000002, 0xa8000002,
+ 0xa0000002, 0xf0000002, 0xf8000002, 0x88000002,
+ 0x00000007, 0x60000007, 0x40000007, 0x48000007,
+ 0x68000007, 0x10000007, 0x50000007, 0x58000007,
+ 0x38000007, 0x18000007, 0x30000007, 0x28000007,
+ 0x20000007, 0x70000007, 0x78000007, 0x08000007,
+ 0x80000005, 0xe0000005, 0xc0000005, 0xc8000005,
+ 0xe8000005, 0x90000005, 0xd0000005, 0xd8000005,
+ 0xb8000005, 0x98000005, 0xb0000005, 0xa8000005,
+ 0xa0000005, 0xf0000005, 0xf8000005, 0x88000005,
+ 0x80000000, 0xe0000000, 0xc0000000, 0xc8000000,
+ 0xe8000000, 0x90000000, 0xd0000000, 0xd8000000,
+ 0xb8000000, 0x98000000, 0xb0000000, 0xa8000000,
+ 0xa0000000, 0xf0000000, 0xf8000000, 0x88000000,
+ 0x00000005, 0x60000005, 0x40000005, 0x48000005,
+ 0x68000005, 0x10000005, 0x50000005, 0x58000005,
+ 0x38000005, 0x18000005, 0x30000005, 0x28000005,
+ 0x20000005, 0x70000005, 0x78000005, 0x08000005,
+ 0x00000002, 0x60000002, 0x40000002, 0x48000002,
+ 0x68000002, 0x10000002, 0x50000002, 0x58000002,
+ 0x38000002, 0x18000002, 0x30000002, 0x28000002,
+ 0x20000002, 0x70000002, 0x78000002, 0x08000002,
+ 0x80000003, 0xe0000003, 0xc0000003, 0xc8000003,
+ 0xe8000003, 0x90000003, 0xd0000003, 0xd8000003,
+ 0xb8000003, 0x98000003, 0xb0000003, 0xa8000003,
+ 0xa0000003, 0xf0000003, 0xf8000003, 0x88000003,
+ 0x00000006, 0x60000006, 0x40000006, 0x48000006,
+ 0x68000006, 0x10000006, 0x50000006, 0x58000006,
+ 0x38000006, 0x18000006, 0x30000006, 0x28000006,
+ 0x20000006, 0x70000006, 0x78000006, 0x08000006,
+ 0x80000004, 0xe0000004, 0xc0000004, 0xc8000004,
+ 0xe8000004, 0x90000004, 0xd0000004, 0xd8000004,
+ 0xb8000004, 0x98000004, 0xb0000004, 0xa8000004,
+ 0xa0000004, 0xf0000004, 0xf8000004, 0x88000004,
+ 0x80000006, 0xe0000006, 0xc0000006, 0xc8000006,
+ 0xe8000006, 0x90000006, 0xd0000006, 0xd8000006,
+ 0xb8000006, 0x98000006, 0xb0000006, 0xa8000006,
+ 0xa0000006, 0xf0000006, 0xf8000006, 0x88000006,
+ 0x00000003, 0x60000003, 0x40000003, 0x48000003,
+ 0x68000003, 0x10000003, 0x50000003, 0x58000003,
+ 0x38000003, 0x18000003, 0x30000003, 0x28000003,
+ 0x20000003, 0x70000003, 0x78000003, 0x08000003,
+ /* 3 */
+ 0x00000098, 0x00000080, 0x000000b0, 0x000000f8,
+ 0x00000088, 0x000000f0, 0x000000c8, 0x00000090,
+ 0x000000e8, 0x000000c0, 0x000000e0, 0x000000a0,
+ 0x000000d8, 0x000000d0, 0x000000a8, 0x000000b8,
+ 0x00000518, 0x00000500, 0x00000530, 0x00000578,
+ 0x00000508, 0x00000570, 0x00000548, 0x00000510,
+ 0x00000568, 0x00000540, 0x00000560, 0x00000520,
+ 0x00000558, 0x00000550, 0x00000528, 0x00000538,
+ 0x00000318, 0x00000300, 0x00000330, 0x00000378,
+ 0x00000308, 0x00000370, 0x00000348, 0x00000310,
+ 0x00000368, 0x00000340, 0x00000360, 0x00000320,
+ 0x00000358, 0x00000350, 0x00000328, 0x00000338,
+ 0x00000418, 0x00000400, 0x00000430, 0x00000478,
+ 0x00000408, 0x00000470, 0x00000448, 0x00000410,
+ 0x00000468, 0x00000440, 0x00000460, 0x00000420,
+ 0x00000458, 0x00000450, 0x00000428, 0x00000438,
+ 0x00000798, 0x00000780, 0x000007b0, 0x000007f8,
+ 0x00000788, 0x000007f0, 0x000007c8, 0x00000790,
+ 0x000007e8, 0x000007c0, 0x000007e0, 0x000007a0,
+ 0x000007d8, 0x000007d0, 0x000007a8, 0x000007b8,
+ 0x00000598, 0x00000580, 0x000005b0, 0x000005f8,
+ 0x00000588, 0x000005f0, 0x000005c8, 0x00000590,
+ 0x000005e8, 0x000005c0, 0x000005e0, 0x000005a0,
+ 0x000005d8, 0x000005d0, 0x000005a8, 0x000005b8,
+ 0x00000018, 0x00000000, 0x00000030, 0x00000078,
+ 0x00000008, 0x00000070, 0x00000048, 0x00000010,
+ 0x00000068, 0x00000040, 0x00000060, 0x00000020,
+ 0x00000058, 0x00000050, 0x00000028, 0x00000038,
+ 0x00000218, 0x00000200, 0x00000230, 0x00000278,
+ 0x00000208, 0x00000270, 0x00000248, 0x00000210,
+ 0x00000268, 0x00000240, 0x00000260, 0x00000220,
+ 0x00000258, 0x00000250, 0x00000228, 0x00000238,
+ 0x00000618, 0x00000600, 0x00000630, 0x00000678,
+ 0x00000608, 0x00000670, 0x00000648, 0x00000610,
+ 0x00000668, 0x00000640, 0x00000660, 0x00000620,
+ 0x00000658, 0x00000650, 0x00000628, 0x00000638,
+ 0x00000198, 0x00000180, 0x000001b0, 0x000001f8,
+ 0x00000188, 0x000001f0, 0x000001c8, 0x00000190,
+ 0x000001e8, 0x000001c0, 0x000001e0, 0x000001a0,
+ 0x000001d8, 0x000001d0, 0x000001a8, 0x000001b8,
+ 0x00000298, 0x00000280, 0x000002b0, 0x000002f8,
+ 0x00000288, 0x000002f0, 0x000002c8, 0x00000290,
+ 0x000002e8, 0x000002c0, 0x000002e0, 0x000002a0,
+ 0x000002d8, 0x000002d0, 0x000002a8, 0x000002b8,
+ 0x00000498, 0x00000480, 0x000004b0, 0x000004f8,
+ 0x00000488, 0x000004f0, 0x000004c8, 0x00000490,
+ 0x000004e8, 0x000004c0, 0x000004e0, 0x000004a0,
+ 0x000004d8, 0x000004d0, 0x000004a8, 0x000004b8,
+ 0x00000398, 0x00000380, 0x000003b0, 0x000003f8,
+ 0x00000388, 0x000003f0, 0x000003c8, 0x00000390,
+ 0x000003e8, 0x000003c0, 0x000003e0, 0x000003a0,
+ 0x000003d8, 0x000003d0, 0x000003a8, 0x000003b8,
+ 0x00000698, 0x00000680, 0x000006b0, 0x000006f8,
+ 0x00000688, 0x000006f0, 0x000006c8, 0x00000690,
+ 0x000006e8, 0x000006c0, 0x000006e0, 0x000006a0,
+ 0x000006d8, 0x000006d0, 0x000006a8, 0x000006b8,
+ 0x00000118, 0x00000100, 0x00000130, 0x00000178,
+ 0x00000108, 0x00000170, 0x00000148, 0x00000110,
+ 0x00000168, 0x00000140, 0x00000160, 0x00000120,
+ 0x00000158, 0x00000150, 0x00000128, 0x00000138,
+ 0x00000718, 0x00000700, 0x00000730, 0x00000778,
+ 0x00000708, 0x00000770, 0x00000748, 0x00000710,
+ 0x00000768, 0x00000740, 0x00000760, 0x00000720,
+ 0x00000758, 0x00000750, 0x00000728, 0x00000738,
+ }
+};
+
+const struct gost28147_param gost28147_param_TC26_Z =
+{
+ 1,
+ {
+ /* 0 */
+ 0x00036000, 0x00032000, 0x00033000, 0x00031000,
+ 0x00035000, 0x00032800, 0x00035800, 0x00034800,
+ 0x00037000, 0x00034000, 0x00036800, 0x00033800,
+ 0x00030000, 0x00031800, 0x00037800, 0x00030800,
+ 0x00046000, 0x00042000, 0x00043000, 0x00041000,
+ 0x00045000, 0x00042800, 0x00045800, 0x00044800,
+ 0x00047000, 0x00044000, 0x00046800, 0x00043800,
+ 0x00040000, 0x00041800, 0x00047800, 0x00040800,
+ 0x00016000, 0x00012000, 0x00013000, 0x00011000,
+ 0x00015000, 0x00012800, 0x00015800, 0x00014800,
+ 0x00017000, 0x00014000, 0x00016800, 0x00013800,
+ 0x00010000, 0x00011800, 0x00017800, 0x00010800,
+ 0x0001e000, 0x0001a000, 0x0001b000, 0x00019000,
+ 0x0001d000, 0x0001a800, 0x0001d800, 0x0001c800,
+ 0x0001f000, 0x0001c000, 0x0001e800, 0x0001b800,
+ 0x00018000, 0x00019800, 0x0001f800, 0x00018800,
+ 0x0004e000, 0x0004a000, 0x0004b000, 0x00049000,
+ 0x0004d000, 0x0004a800, 0x0004d800, 0x0004c800,
+ 0x0004f000, 0x0004c000, 0x0004e800, 0x0004b800,
+ 0x00048000, 0x00049800, 0x0004f800, 0x00048800,
+ 0x00056000, 0x00052000, 0x00053000, 0x00051000,
+ 0x00055000, 0x00052800, 0x00055800, 0x00054800,
+ 0x00057000, 0x00054000, 0x00056800, 0x00053800,
+ 0x00050000, 0x00051800, 0x00057800, 0x00050800,
+ 0x0002e000, 0x0002a000, 0x0002b000, 0x00029000,
+ 0x0002d000, 0x0002a800, 0x0002d800, 0x0002c800,
+ 0x0002f000, 0x0002c000, 0x0002e800, 0x0002b800,
+ 0x00028000, 0x00029800, 0x0002f800, 0x00028800,
+ 0x00066000, 0x00062000, 0x00063000, 0x00061000,
+ 0x00065000, 0x00062800, 0x00065800, 0x00064800,
+ 0x00067000, 0x00064000, 0x00066800, 0x00063800,
+ 0x00060000, 0x00061800, 0x00067800, 0x00060800,
+ 0x0000e000, 0x0000a000, 0x0000b000, 0x00009000,
+ 0x0000d000, 0x0000a800, 0x0000d800, 0x0000c800,
+ 0x0000f000, 0x0000c000, 0x0000e800, 0x0000b800,
+ 0x00008000, 0x00009800, 0x0000f800, 0x00008800,
+ 0x00076000, 0x00072000, 0x00073000, 0x00071000,
+ 0x00075000, 0x00072800, 0x00075800, 0x00074800,
+ 0x00077000, 0x00074000, 0x00076800, 0x00073800,
+ 0x00070000, 0x00071800, 0x00077800, 0x00070800,
+ 0x00026000, 0x00022000, 0x00023000, 0x00021000,
+ 0x00025000, 0x00022800, 0x00025800, 0x00024800,
+ 0x00027000, 0x00024000, 0x00026800, 0x00023800,
+ 0x00020000, 0x00021800, 0x00027800, 0x00020800,
+ 0x0003e000, 0x0003a000, 0x0003b000, 0x00039000,
+ 0x0003d000, 0x0003a800, 0x0003d800, 0x0003c800,
+ 0x0003f000, 0x0003c000, 0x0003e800, 0x0003b800,
+ 0x00038000, 0x00039800, 0x0003f800, 0x00038800,
+ 0x0005e000, 0x0005a000, 0x0005b000, 0x00059000,
+ 0x0005d000, 0x0005a800, 0x0005d800, 0x0005c800,
+ 0x0005f000, 0x0005c000, 0x0005e800, 0x0005b800,
+ 0x00058000, 0x00059800, 0x0005f800, 0x00058800,
+ 0x0006e000, 0x0006a000, 0x0006b000, 0x00069000,
+ 0x0006d000, 0x0006a800, 0x0006d800, 0x0006c800,
+ 0x0006f000, 0x0006c000, 0x0006e800, 0x0006b800,
+ 0x00068000, 0x00069800, 0x0006f800, 0x00068800,
+ 0x00006000, 0x00002000, 0x00003000, 0x00001000,
+ 0x00005000, 0x00002800, 0x00005800, 0x00004800,
+ 0x00007000, 0x00004000, 0x00006800, 0x00003800,
+ 0x00000000, 0x00001800, 0x00007800, 0x00000800,
+ 0x0007e000, 0x0007a000, 0x0007b000, 0x00079000,
+ 0x0007d000, 0x0007a800, 0x0007d800, 0x0007c800,
+ 0x0007f000, 0x0007c000, 0x0007e800, 0x0007b800,
+ 0x00078000, 0x00079800, 0x0007f800, 0x00078800,
+ /* 1 */
+ 0x06580000, 0x06180000, 0x06280000, 0x06400000,
+ 0x06100000, 0x06780000, 0x06500000, 0x06680000,
+ 0x06700000, 0x06080000, 0x06380000, 0x06200000,
+ 0x06600000, 0x06480000, 0x06300000, 0x06000000,
+ 0x04580000, 0x04180000, 0x04280000, 0x04400000,
+ 0x04100000, 0x04780000, 0x04500000, 0x04680000,
+ 0x04700000, 0x04080000, 0x04380000, 0x04200000,
+ 0x04600000, 0x04480000, 0x04300000, 0x04000000,
+ 0x01580000, 0x01180000, 0x01280000, 0x01400000,
+ 0x01100000, 0x01780000, 0x01500000, 0x01680000,
+ 0x01700000, 0x01080000, 0x01380000, 0x01200000,
+ 0x01600000, 0x01480000, 0x01300000, 0x01000000,
+ 0x00d80000, 0x00980000, 0x00a80000, 0x00c00000,
+ 0x00900000, 0x00f80000, 0x00d00000, 0x00e80000,
+ 0x00f00000, 0x00880000, 0x00b80000, 0x00a00000,
+ 0x00e00000, 0x00c80000, 0x00b00000, 0x00800000,
+ 0x06d80000, 0x06980000, 0x06a80000, 0x06c00000,
+ 0x06900000, 0x06f80000, 0x06d00000, 0x06e80000,
+ 0x06f00000, 0x06880000, 0x06b80000, 0x06a00000,
+ 0x06e00000, 0x06c80000, 0x06b00000, 0x06800000,
+ 0x02580000, 0x02180000, 0x02280000, 0x02400000,
+ 0x02100000, 0x02780000, 0x02500000, 0x02680000,
+ 0x02700000, 0x02080000, 0x02380000, 0x02200000,
+ 0x02600000, 0x02480000, 0x02300000, 0x02000000,
+ 0x07d80000, 0x07980000, 0x07a80000, 0x07c00000,
+ 0x07900000, 0x07f80000, 0x07d00000, 0x07e80000,
+ 0x07f00000, 0x07880000, 0x07b80000, 0x07a00000,
+ 0x07e00000, 0x07c80000, 0x07b00000, 0x07800000,
+ 0x03580000, 0x03180000, 0x03280000, 0x03400000,
+ 0x03100000, 0x03780000, 0x03500000, 0x03680000,
+ 0x03700000, 0x03080000, 0x03380000, 0x03200000,
+ 0x03600000, 0x03480000, 0x03300000, 0x03000000,
+ 0x03d80000, 0x03980000, 0x03a80000, 0x03c00000,
+ 0x03900000, 0x03f80000, 0x03d00000, 0x03e80000,
+ 0x03f00000, 0x03880000, 0x03b80000, 0x03a00000,
+ 0x03e00000, 0x03c80000, 0x03b00000, 0x03800000,
+ 0x00580000, 0x00180000, 0x00280000, 0x00400000,
+ 0x00100000, 0x00780000, 0x00500000, 0x00680000,
+ 0x00700000, 0x00080000, 0x00380000, 0x00200000,
+ 0x00600000, 0x00480000, 0x00300000, 0x00000000,
+ 0x05580000, 0x05180000, 0x05280000, 0x05400000,
+ 0x05100000, 0x05780000, 0x05500000, 0x05680000,
+ 0x05700000, 0x05080000, 0x05380000, 0x05200000,
+ 0x05600000, 0x05480000, 0x05300000, 0x05000000,
+ 0x02d80000, 0x02980000, 0x02a80000, 0x02c00000,
+ 0x02900000, 0x02f80000, 0x02d00000, 0x02e80000,
+ 0x02f00000, 0x02880000, 0x02b80000, 0x02a00000,
+ 0x02e00000, 0x02c80000, 0x02b00000, 0x02800000,
+ 0x01d80000, 0x01980000, 0x01a80000, 0x01c00000,
+ 0x01900000, 0x01f80000, 0x01d00000, 0x01e80000,
+ 0x01f00000, 0x01880000, 0x01b80000, 0x01a00000,
+ 0x01e00000, 0x01c80000, 0x01b00000, 0x01800000,
+ 0x07580000, 0x07180000, 0x07280000, 0x07400000,
+ 0x07100000, 0x07780000, 0x07500000, 0x07680000,
+ 0x07700000, 0x07080000, 0x07380000, 0x07200000,
+ 0x07600000, 0x07480000, 0x07300000, 0x07000000,
+ 0x04d80000, 0x04980000, 0x04a80000, 0x04c00000,
+ 0x04900000, 0x04f80000, 0x04d00000, 0x04e80000,
+ 0x04f00000, 0x04880000, 0x04b80000, 0x04a00000,
+ 0x04e00000, 0x04c80000, 0x04b00000, 0x04800000,
+ 0x05d80000, 0x05980000, 0x05a80000, 0x05c00000,
+ 0x05900000, 0x05f80000, 0x05d00000, 0x05e80000,
+ 0x05f00000, 0x05880000, 0x05b80000, 0x05a00000,
+ 0x05e00000, 0x05c80000, 0x05b00000, 0x05800000,
+ /* 2 */
+ 0xb8000002, 0xf8000002, 0xa8000002, 0xd0000002,
+ 0xc0000002, 0x88000002, 0xb0000002, 0xe8000002,
+ 0x80000002, 0xc8000002, 0x98000002, 0xf0000002,
+ 0xd8000002, 0xa0000002, 0x90000002, 0xe0000002,
+ 0xb8000006, 0xf8000006, 0xa8000006, 0xd0000006,
+ 0xc0000006, 0x88000006, 0xb0000006, 0xe8000006,
+ 0x80000006, 0xc8000006, 0x98000006, 0xf0000006,
+ 0xd8000006, 0xa0000006, 0x90000006, 0xe0000006,
+ 0xb8000007, 0xf8000007, 0xa8000007, 0xd0000007,
+ 0xc0000007, 0x88000007, 0xb0000007, 0xe8000007,
+ 0x80000007, 0xc8000007, 0x98000007, 0xf0000007,
+ 0xd8000007, 0xa0000007, 0x90000007, 0xe0000007,
+ 0x38000003, 0x78000003, 0x28000003, 0x50000003,
+ 0x40000003, 0x08000003, 0x30000003, 0x68000003,
+ 0x00000003, 0x48000003, 0x18000003, 0x70000003,
+ 0x58000003, 0x20000003, 0x10000003, 0x60000003,
+ 0xb8000004, 0xf8000004, 0xa8000004, 0xd0000004,
+ 0xc0000004, 0x88000004, 0xb0000004, 0xe8000004,
+ 0x80000004, 0xc8000004, 0x98000004, 0xf0000004,
+ 0xd8000004, 0xa0000004, 0x90000004, 0xe0000004,
+ 0x38000001, 0x78000001, 0x28000001, 0x50000001,
+ 0x40000001, 0x08000001, 0x30000001, 0x68000001,
+ 0x00000001, 0x48000001, 0x18000001, 0x70000001,
+ 0x58000001, 0x20000001, 0x10000001, 0x60000001,
+ 0x38000006, 0x78000006, 0x28000006, 0x50000006,
+ 0x40000006, 0x08000006, 0x30000006, 0x68000006,
+ 0x00000006, 0x48000006, 0x18000006, 0x70000006,
+ 0x58000006, 0x20000006, 0x10000006, 0x60000006,
+ 0x38000005, 0x78000005, 0x28000005, 0x50000005,
+ 0x40000005, 0x08000005, 0x30000005, 0x68000005,
+ 0x00000005, 0x48000005, 0x18000005, 0x70000005,
+ 0x58000005, 0x20000005, 0x10000005, 0x60000005,
+ 0xb8000005, 0xf8000005, 0xa8000005, 0xd0000005,
+ 0xc0000005, 0x88000005, 0xb0000005, 0xe8000005,
+ 0x80000005, 0xc8000005, 0x98000005, 0xf0000005,
+ 0xd8000005, 0xa0000005, 0x90000005, 0xe0000005,
+ 0xb8000003, 0xf8000003, 0xa8000003, 0xd0000003,
+ 0xc0000003, 0x88000003, 0xb0000003, 0xe8000003,
+ 0x80000003, 0xc8000003, 0x98000003, 0xf0000003,
+ 0xd8000003, 0xa0000003, 0x90000003, 0xe0000003,
+ 0x38000004, 0x78000004, 0x28000004, 0x50000004,
+ 0x40000004, 0x08000004, 0x30000004, 0x68000004,
+ 0x00000004, 0x48000004, 0x18000004, 0x70000004,
+ 0x58000004, 0x20000004, 0x10000004, 0x60000004,
+ 0xb8000000, 0xf8000000, 0xa8000000, 0xd0000000,
+ 0xc0000000, 0x88000000, 0xb0000000, 0xe8000000,
+ 0x80000000, 0xc8000000, 0x98000000, 0xf0000000,
+ 0xd8000000, 0xa0000000, 0x90000000, 0xe0000000,
+ 0x38000002, 0x78000002, 0x28000002, 0x50000002,
+ 0x40000002, 0x08000002, 0x30000002, 0x68000002,
+ 0x00000002, 0x48000002, 0x18000002, 0x70000002,
+ 0x58000002, 0x20000002, 0x10000002, 0x60000002,
+ 0xb8000001, 0xf8000001, 0xa8000001, 0xd0000001,
+ 0xc0000001, 0x88000001, 0xb0000001, 0xe8000001,
+ 0x80000001, 0xc8000001, 0x98000001, 0xf0000001,
+ 0xd8000001, 0xa0000001, 0x90000001, 0xe0000001,
+ 0x38000007, 0x78000007, 0x28000007, 0x50000007,
+ 0x40000007, 0x08000007, 0x30000007, 0x68000007,
+ 0x00000007, 0x48000007, 0x18000007, 0x70000007,
+ 0x58000007, 0x20000007, 0x10000007, 0x60000007,
+ 0x38000000, 0x78000000, 0x28000000, 0x50000000,
+ 0x40000000, 0x08000000, 0x30000000, 0x68000000,
+ 0x00000000, 0x48000000, 0x18000000, 0x70000000,
+ 0x58000000, 0x20000000, 0x10000000, 0x60000000,
+ /* 3 */
+ 0x000000c0, 0x000000f0, 0x00000090, 0x000000a8,
+ 0x000000b0, 0x000000c8, 0x00000088, 0x000000e0,
+ 0x000000f8, 0x000000a0, 0x000000d8, 0x00000080,
+ 0x000000e8, 0x000000d0, 0x00000098, 0x000000b8,
+ 0x000003c0, 0x000003f0, 0x00000390, 0x000003a8,
+ 0x000003b0, 0x000003c8, 0x00000388, 0x000003e0,
+ 0x000003f8, 0x000003a0, 0x000003d8, 0x00000380,
+ 0x000003e8, 0x000003d0, 0x00000398, 0x000003b8,
+ 0x00000740, 0x00000770, 0x00000710, 0x00000728,
+ 0x00000730, 0x00000748, 0x00000708, 0x00000760,
+ 0x00000778, 0x00000720, 0x00000758, 0x00000700,
+ 0x00000768, 0x00000750, 0x00000718, 0x00000738,
+ 0x000006c0, 0x000006f0, 0x00000690, 0x000006a8,
+ 0x000006b0, 0x000006c8, 0x00000688, 0x000006e0,
+ 0x000006f8, 0x000006a0, 0x000006d8, 0x00000680,
+ 0x000006e8, 0x000006d0, 0x00000698, 0x000006b8,
+ 0x00000040, 0x00000070, 0x00000010, 0x00000028,
+ 0x00000030, 0x00000048, 0x00000008, 0x00000060,
+ 0x00000078, 0x00000020, 0x00000058, 0x00000000,
+ 0x00000068, 0x00000050, 0x00000018, 0x00000038,
+ 0x000002c0, 0x000002f0, 0x00000290, 0x000002a8,
+ 0x000002b0, 0x000002c8, 0x00000288, 0x000002e0,
+ 0x000002f8, 0x000002a0, 0x000002d8, 0x00000280,
+ 0x000002e8, 0x000002d0, 0x00000298, 0x000002b8,
+ 0x00000440, 0x00000470, 0x00000410, 0x00000428,
+ 0x00000430, 0x00000448, 0x00000408, 0x00000460,
+ 0x00000478, 0x00000420, 0x00000458, 0x00000400,
+ 0x00000468, 0x00000450, 0x00000418, 0x00000438,
+ 0x000001c0, 0x000001f0, 0x00000190, 0x000001a8,
+ 0x000001b0, 0x000001c8, 0x00000188, 0x000001e0,
+ 0x000001f8, 0x000001a0, 0x000001d8, 0x00000180,
+ 0x000001e8, 0x000001d0, 0x00000198, 0x000001b8,
+ 0x00000240, 0x00000270, 0x00000210, 0x00000228,
+ 0x00000230, 0x00000248, 0x00000208, 0x00000260,
+ 0x00000278, 0x00000220, 0x00000258, 0x00000200,
+ 0x00000268, 0x00000250, 0x00000218, 0x00000238,
+ 0x000007c0, 0x000007f0, 0x00000790, 0x000007a8,
+ 0x000007b0, 0x000007c8, 0x00000788, 0x000007e0,
+ 0x000007f8, 0x000007a0, 0x000007d8, 0x00000780,
+ 0x000007e8, 0x000007d0, 0x00000798, 0x000007b8,
+ 0x00000540, 0x00000570, 0x00000510, 0x00000528,
+ 0x00000530, 0x00000548, 0x00000508, 0x00000560,
+ 0x00000578, 0x00000520, 0x00000558, 0x00000500,
+ 0x00000568, 0x00000550, 0x00000518, 0x00000538,
+ 0x00000340, 0x00000370, 0x00000310, 0x00000328,
+ 0x00000330, 0x00000348, 0x00000308, 0x00000360,
+ 0x00000378, 0x00000320, 0x00000358, 0x00000300,
+ 0x00000368, 0x00000350, 0x00000318, 0x00000338,
+ 0x000004c0, 0x000004f0, 0x00000490, 0x000004a8,
+ 0x000004b0, 0x000004c8, 0x00000488, 0x000004e0,
+ 0x000004f8, 0x000004a0, 0x000004d8, 0x00000480,
+ 0x000004e8, 0x000004d0, 0x00000498, 0x000004b8,
+ 0x00000640, 0x00000670, 0x00000610, 0x00000628,
+ 0x00000630, 0x00000648, 0x00000608, 0x00000660,
+ 0x00000678, 0x00000620, 0x00000658, 0x00000600,
+ 0x00000668, 0x00000650, 0x00000618, 0x00000638,
+ 0x000005c0, 0x000005f0, 0x00000590, 0x000005a8,
+ 0x000005b0, 0x000005c8, 0x00000588, 0x000005e0,
+ 0x000005f8, 0x000005a0, 0x000005d8, 0x00000580,
+ 0x000005e8, 0x000005d0, 0x00000598, 0x000005b8,
+ 0x00000140, 0x00000170, 0x00000110, 0x00000128,
+ 0x00000130, 0x00000148, 0x00000108, 0x00000160,
+ 0x00000178, 0x00000120, 0x00000158, 0x00000100,
+ 0x00000168, 0x00000150, 0x00000118, 0x00000138,
+ }
+};
+
+/*
+ * A macro that performs a full encryption round of GOST 28147-89.
+ * Temporary variables tmp assumed and variables r and l for left and right
+ * blocks.
+ */
+#define GOST_ENCRYPT_ROUND(key1, key2, sbox) \
+ tmp = (key1) + r; \
+ l ^= (sbox)[0*256 + (tmp & 0xff)] ^ (sbox)[1*256 + ((tmp >> 8) & 0xff)] ^ \
+ (sbox)[2*256 + ((tmp >> 16) & 0xff)] ^ (sbox)[3*256 + (tmp >> 24)]; \
+ tmp = (key2) + l; \
+ r ^= (sbox)[0*256 + (tmp & 0xff)] ^ (sbox)[1*256 + ((tmp >> 8) & 0xff)] ^ \
+ (sbox)[2*256 + ((tmp >> 16) & 0xff)] ^ (sbox)[3*256 + (tmp >> 24)];
+
+/* encrypt a block with the given key */
+void gost28147_encrypt_simple (const uint32_t *key, const uint32_t *sbox,
+ const uint32_t *in, uint32_t *out)
+{
+ uint32_t l, r, tmp;
+
+ r = in[0], l = in[1];
+ GOST_ENCRYPT_ROUND(key[0], key[1], sbox)
+ GOST_ENCRYPT_ROUND(key[2], key[3], sbox)
+ GOST_ENCRYPT_ROUND(key[4], key[5], sbox)
+ GOST_ENCRYPT_ROUND(key[6], key[7], sbox)
+ GOST_ENCRYPT_ROUND(key[0], key[1], sbox)
+ GOST_ENCRYPT_ROUND(key[2], key[3], sbox)
+ GOST_ENCRYPT_ROUND(key[4], key[5], sbox)
+ GOST_ENCRYPT_ROUND(key[6], key[7], sbox)
+ GOST_ENCRYPT_ROUND(key[0], key[1], sbox)
+ GOST_ENCRYPT_ROUND(key[2], key[3], sbox)
+ GOST_ENCRYPT_ROUND(key[4], key[5], sbox)
+ GOST_ENCRYPT_ROUND(key[6], key[7], sbox)
+ GOST_ENCRYPT_ROUND(key[7], key[6], sbox)
+ GOST_ENCRYPT_ROUND(key[5], key[4], sbox)
+ GOST_ENCRYPT_ROUND(key[3], key[2], sbox)
+ GOST_ENCRYPT_ROUND(key[1], key[0], sbox)
+ *out = l, *(out + 1) = r;
+}
+
+static void gost28147_decrypt_simple (const uint32_t *key, const uint32_t *sbox,
+ const uint32_t *in, uint32_t *out)
+{
+ uint32_t l, r, tmp;
+
+ r = in[0], l = in[1];
+ GOST_ENCRYPT_ROUND(key[0], key[1], sbox)
+ GOST_ENCRYPT_ROUND(key[2], key[3], sbox)
+ GOST_ENCRYPT_ROUND(key[4], key[5], sbox)
+ GOST_ENCRYPT_ROUND(key[6], key[7], sbox)
+ GOST_ENCRYPT_ROUND(key[7], key[6], sbox)
+ GOST_ENCRYPT_ROUND(key[5], key[4], sbox)
+ GOST_ENCRYPT_ROUND(key[3], key[2], sbox)
+ GOST_ENCRYPT_ROUND(key[1], key[0], sbox)
+ GOST_ENCRYPT_ROUND(key[7], key[6], sbox)
+ GOST_ENCRYPT_ROUND(key[5], key[4], sbox)
+ GOST_ENCRYPT_ROUND(key[3], key[2], sbox)
+ GOST_ENCRYPT_ROUND(key[1], key[0], sbox)
+ GOST_ENCRYPT_ROUND(key[7], key[6], sbox)
+ GOST_ENCRYPT_ROUND(key[5], key[4], sbox)
+ GOST_ENCRYPT_ROUND(key[3], key[2], sbox)
+ GOST_ENCRYPT_ROUND(key[1], key[0], sbox)
+ *out = l, *(out + 1) = r;
+}
+
+static const uint32_t gost28147_key_mesh_cryptopro_data[GOST28147_KEY_SIZE / 4] = {
+ 0x22720069, 0x2304c964,
+ 0x96db3a8d, 0xc42ae946,
+ 0x94acfe18, 0x1207ed00,
+ 0xc2dc86c0, 0x2ba94cef,
+};
+
+static void gost28147_key_mesh_cryptopro(struct gost28147_ctx *ctx)
+{
+ uint32_t newkey[GOST28147_KEY_SIZE/4];
+
+ gost28147_decrypt_simple(ctx->key, ctx->sbox,
+ &gost28147_key_mesh_cryptopro_data[0],
+ &newkey[0]);
+
+ gost28147_decrypt_simple(ctx->key, ctx->sbox,
+ &gost28147_key_mesh_cryptopro_data[2],
+ &newkey[2]);
+
+ gost28147_decrypt_simple(ctx->key, ctx->sbox,
+ &gost28147_key_mesh_cryptopro_data[4],
+ &newkey[4]);
+
+ gost28147_decrypt_simple(ctx->key, ctx->sbox,
+ &gost28147_key_mesh_cryptopro_data[6],
+ &newkey[6]);
+
+ memcpy(ctx->key, newkey, sizeof(newkey));
+ ctx->key_count = 0;
+}
+
+static void
+_gost28147_set_key(struct gost28147_ctx *ctx, const uint8_t *key)
+{
+ unsigned i;
+
+ for (i = 0; i < 8; i++, key += 4)
+ ctx->key[i] = LE_READ_UINT32(key);
+ ctx->key_count = 0;
+}
+
+void
+gost28147_set_key(struct gost28147_ctx *ctx, const uint8_t *key)
+{
+ assert(key);
+ _gost28147_set_key(ctx, key);
+ gost28147_set_param(ctx, &gost28147_param_TC26_Z);
+}
+
+void
+gost28147_set_param(struct gost28147_ctx *ctx, const struct gost28147_param *param)
+{
+ assert(param);
+ ctx->sbox = param->sbox;
+ ctx->key_meshing = param->key_meshing;
+}
+
+void
+gost28147_encrypt(const struct gost28147_ctx *ctx,
+ size_t length, uint8_t *dst,
+ const uint8_t *src)
+{
+ uint32_t block[2];
+
+ assert(!(length % GOST28147_BLOCK_SIZE));
+
+ while (length)
+ {
+ block[0] = LE_READ_UINT32(src); src += 4;
+ block[1] = LE_READ_UINT32(src); src += 4;
+ gost28147_encrypt_simple(ctx->key, ctx->sbox, block, block);
+ LE_WRITE_UINT32(dst, block[0]); dst += 4;
+ LE_WRITE_UINT32(dst, block[1]); dst += 4;
+ length -= GOST28147_BLOCK_SIZE;
+ }
+}
+
+void
+gost28147_decrypt(const struct gost28147_ctx *ctx,
+ size_t length, uint8_t *dst,
+ const uint8_t *src)
+{
+ uint32_t block[2];
+
+ assert(!(length % GOST28147_BLOCK_SIZE));
+
+ while (length)
+ {
+ block[0] = LE_READ_UINT32(src); src += 4;
+ block[1] = LE_READ_UINT32(src); src += 4;
+ gost28147_decrypt_simple(ctx->key, ctx->sbox, block, block);
+ LE_WRITE_UINT32(dst, block[0]); dst += 4;
+ LE_WRITE_UINT32(dst, block[1]); dst += 4;
+ length -= GOST28147_BLOCK_SIZE;
+ }
+}
+
+void
+gost28147_encrypt_for_cfb(struct gost28147_ctx *ctx,
+ size_t length, uint8_t *dst,
+ const uint8_t *src)
+{
+ uint32_t block[2];
+
+ assert(!(length % GOST28147_BLOCK_SIZE));
+
+ while (length)
+ {
+ block[0] = LE_READ_UINT32(src); src += 4;
+ block[1] = LE_READ_UINT32(src); src += 4;
+ if (ctx->key_meshing && ctx->key_count == 1024)
+ {
+ gost28147_key_mesh_cryptopro(ctx);
+ gost28147_encrypt_simple(ctx->key, ctx->sbox, block, block);
+ ctx->key_count = 0;
+ }
+ gost28147_encrypt_simple(ctx->key, ctx->sbox, block, block);
+ LE_WRITE_UINT32(dst, block[0]); dst += 4;
+ LE_WRITE_UINT32(dst, block[1]); dst += 4;
+ length -= GOST28147_BLOCK_SIZE;
+ ctx->key_count += GOST28147_BLOCK_SIZE;
+ }
+}
diff --git a/lib/nettle/gost/gost28147.h b/lib/nettle/gost/gost28147.h
new file mode 100644
index 0000000000..1949254924
--- /dev/null
+++ b/lib/nettle/gost/gost28147.h
@@ -0,0 +1,118 @@
+/* gost28147.h
+
+ The GOST 28147-89 (MAGMA) cipher function, described in RFC 5831.
+
+ Copyright (C) 2015 Dmitry Eremin-Solenikov
+ Copyright (C) 2012 Nikos Mavrogiannopoulos, Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#ifndef NETTLE_GOST28147_H_INCLUDED
+#define NETTLE_GOST28147_H_INCLUDED
+
+#include <nettle/nettle-types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* S-Boxes & parameters */
+#define gost28147_param_test_3411 _gnutls_gost28147_param_test_3411
+#define gost28147_param_CryptoPro_3411 _gnutls_gost28147_param_CryptoPro_3411
+#define gost28147_param_Test_89 _gnutls_gost28147_param_Test_89
+#define gost28147_param_CryptoPro_A _gnutls_gost28147_param_CryptoPro_A
+#define gost28147_param_CryptoPro_B _gnutls_gost28147_param_CryptoPro_B
+#define gost28147_param_CryptoPro_C _gnutls_gost28147_param_CryptoPro_C
+#define gost28147_param_CryptoPro_D _gnutls_gost28147_param_CryptoPro_D
+#define gost28147_param_TC26_Z _gnutls_gost28147_param_TC26_Z
+
+/* Private */
+#define gost28147_encrypt_simple _gnutls_gost28147_encrypt_simple
+
+/* Public functions */
+#define gost28147_set_key _gnutls_gost28147_set_key
+#define gost28147_set_param _gnutls_gost28147_set_param
+#define gost28147_encrypt _gnutls_gost28147_encrypt
+#define gost28147_encrypt_for_cfb _gnutls_gost28147_encrypt_for_cfb
+#define gost28147_decrypt _gnutls_gost28147_decrypt
+
+#define GOST28147_KEY_SIZE 32
+#define GOST28147_BLOCK_SIZE 8
+
+struct gost28147_ctx
+{
+ uint32_t key[GOST28147_KEY_SIZE/4];
+ const uint32_t *sbox;
+ int key_meshing;
+ int key_count; /* Used for key meshing */
+};
+
+struct gost28147_param
+{
+ int key_meshing;
+ uint32_t sbox[4*256];
+};
+
+extern const struct gost28147_param gost28147_param_test_3411;
+extern const struct gost28147_param gost28147_param_CryptoPro_3411;
+extern const struct gost28147_param gost28147_param_Test_89;
+extern const struct gost28147_param gost28147_param_CryptoPro_A;
+extern const struct gost28147_param gost28147_param_CryptoPro_B;
+extern const struct gost28147_param gost28147_param_CryptoPro_C;
+extern const struct gost28147_param gost28147_param_CryptoPro_D;
+extern const struct gost28147_param gost28147_param_TC26_Z;
+
+/* Internal interface for use by GOST R 34.11-94 */
+void gost28147_encrypt_simple (const uint32_t *key, const uint32_t *sbox,
+ const uint32_t *in, uint32_t *out);
+
+void
+gost28147_set_key(struct gost28147_ctx *ctx, const uint8_t *key);
+
+void
+gost28147_set_param(struct gost28147_ctx *ctx,
+ const struct gost28147_param *param);
+
+void
+gost28147_encrypt(const struct gost28147_ctx *ctx,
+ size_t length, uint8_t *dst,
+ const uint8_t *src);
+void
+gost28147_decrypt(const struct gost28147_ctx *ctx,
+ size_t length, uint8_t *dst,
+ const uint8_t *src);
+void
+gost28147_encrypt_for_cfb(struct gost28147_ctx *ctx,
+ size_t length, uint8_t *dst,
+ const uint8_t *src);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NETTLE_GOST28147_H_INCLUDED */
diff --git a/lib/nettle/gost/gostdsa-sign.c b/lib/nettle/gost/gostdsa-sign.c
new file mode 100644
index 0000000000..0c6a2dba67
--- /dev/null
+++ b/lib/nettle/gost/gostdsa-sign.c
@@ -0,0 +1,77 @@
+/* gostdsa-sign.c
+
+ Copyright (C) 2015 Dmitry Eremin-Solenikov
+ Copyright (C) 2013 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include <stdlib.h>
+
+#include "gostdsa.h"
+#include "ecc-internal.h"
+#include "nettle-internal.h"
+
+void
+gostdsa_sign (const struct ecc_scalar *key,
+ void *random_ctx, nettle_random_func *random,
+ size_t digest_length,
+ const uint8_t *digest,
+ struct dsa_signature *signature)
+{
+ /* At most 936 bytes. */
+ TMP_DECL(k, mp_limb_t, ECC_MAX_SIZE + ECC_GOSTDSA_SIGN_ITCH (ECC_MAX_SIZE));
+ mp_limb_t size = key->ecc->p.size;
+ mp_limb_t *rp = mpz_limbs_write (signature->r, size);
+ mp_limb_t *sp = mpz_limbs_write (signature->s, size);
+
+ TMP_ALLOC (k, size + ECC_GOSTDSA_SIGN_ITCH (size));
+
+ /* Timing reveals the number of rounds through this loop, but the
+ timing is still independent of the secret k finally used. */
+ do
+ {
+ do
+ {
+ ecc_mod_random (&key->ecc->q, k, random_ctx, random, k + size);
+ }
+ while (mpn_zero_p(k, size));
+ ecc_gostdsa_sign (key->ecc, key->p, k, digest_length, digest,
+ rp, sp, k + size);
+ mpz_limbs_finish (signature->r, size);
+ mpz_limbs_finish (signature->s, size);
+ }
+ while (mpz_sgn (signature->r) == 0 || mpz_sgn (signature->s) == 0);
+}
diff --git a/lib/nettle/gost/gostdsa-verify.c b/lib/nettle/gost/gostdsa-verify.c
new file mode 100644
index 0000000000..e83bbba48d
--- /dev/null
+++ b/lib/nettle/gost/gostdsa-verify.c
@@ -0,0 +1,81 @@
+/* gostdsa-verify.c
+
+ Copyright (C) 2015 Dmitry Eremin-Solenikov
+ Copyright (C) 2013 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include <stdlib.h>
+
+#include "gostdsa.h"
+
+#include "gmp-glue.h"
+
+int
+gostdsa_verify (const struct ecc_point *pub,
+ size_t length, const uint8_t *digest,
+ const struct dsa_signature *signature)
+{
+ mp_limb_t size = ecc_size (pub->ecc);
+ mp_size_t itch = 2*size + ecc_gostdsa_verify_itch (pub->ecc);
+ /* For ECC_MUL_A_WBITS == 0, at most 1512 bytes. With
+ ECC_MUL_A_WBITS == 4, currently needs 67 * ecc->size, at most
+ 4824 bytes. Don't use stack allocation for this. */
+ mp_limb_t *scratch;
+ int res;
+
+#define rp scratch
+#define sp (scratch + size)
+#define scratch_out (scratch + 2*size)
+
+ if (mpz_sgn (signature->r) <= 0 || mpz_size (signature->r) > size
+ || mpz_sgn (signature->s) <= 0 || mpz_size (signature->s) > size)
+ return 0;
+
+ scratch = gmp_alloc_limbs (itch);
+
+ mpz_limbs_copy (rp, signature->r, size);
+ mpz_limbs_copy (sp, signature->s, size);
+
+ res = ecc_gostdsa_verify (pub->ecc, pub->p, length, digest, rp, sp, scratch_out);
+
+ gmp_free_limbs (scratch, itch);
+
+ return res;
+#undef rp
+#undef sp
+#undef scratch_out
+}
diff --git a/lib/nettle/gost/gostdsa.h b/lib/nettle/gost/gostdsa.h
new file mode 100644
index 0000000000..7546176267
--- /dev/null
+++ b/lib/nettle/gost/gostdsa.h
@@ -0,0 +1,102 @@
+/* gostdsa.h
+
+ Copyright (C) 2015 Dmity Eremin-Solenikov
+ Copyright (C) 2013 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */
+
+#ifndef NETTLE_GOSTDSA_H_INCLUDED
+#define NETTLE_GOSTDSA_H_INCLUDED
+
+#include <nettle/ecc.h>
+#include <nettle/dsa.h>
+#include <nettle/ecdsa.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Name mangling */
+#define gostdsa_sign _gnutls_gostdsa_sign
+#define gostdsa_verify _gnutls_gostdsa_verify
+#define ecc_gostdsa_sign _gnutls_ecc_gostdsa_sign
+#define ecc_gostdsa_sign_itch _gnutls_ecc_gostdsa_sign_itch
+#define ecc_gostdsa_verify _gnutls_ecc_gostdsa_verify
+#define ecc_gostdsa_verify_itch _gnutls_ecc_gostdsa_verify_itch
+
+/* Just use ECDSA function for key generation */
+#define gostdsa_generate_keypair ecdsa_generate_keypair
+
+/* High level GOST DSA functions.
+ *
+ * A public key is represented as a struct ecc_point, and a private
+ * key as a struct ecc_scalar. FIXME: Introduce some aliases? */
+void
+gostdsa_sign (const struct ecc_scalar *key,
+ void *random_ctx, nettle_random_func *random,
+ size_t digest_length,
+ const uint8_t *digest,
+ struct dsa_signature *signature);
+
+int
+gostdsa_verify (const struct ecc_point *pub,
+ size_t length, const uint8_t *digest,
+ const struct dsa_signature *signature);
+
+/* Low-level GOSTDSA functions. */
+mp_size_t
+ecc_gostdsa_sign_itch (const struct ecc_curve *ecc);
+
+void
+ecc_gostdsa_sign (const struct ecc_curve *ecc,
+ const mp_limb_t *zp,
+ /* Random nonce, must be invertible mod ecc group
+ order. */
+ const mp_limb_t *kp,
+ size_t length, const uint8_t *digest,
+ mp_limb_t *rp, mp_limb_t *sp,
+ mp_limb_t *scratch);
+
+mp_size_t
+ecc_gostdsa_verify_itch (const struct ecc_curve *ecc);
+
+int
+ecc_gostdsa_verify (const struct ecc_curve *ecc,
+ const mp_limb_t *pp, /* Public key */
+ size_t length, const uint8_t *digest,
+ const mp_limb_t *rp, const mp_limb_t *sp,
+ mp_limb_t *scratch);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NETTLE_GOSTDSA_H_INCLUDED */
diff --git a/lib/nettle/gost/gosthash94-meta.c b/lib/nettle/gost/gosthash94-meta.c
new file mode 100644
index 0000000000..f398739923
--- /dev/null
+++ b/lib/nettle/gost/gosthash94-meta.c
@@ -0,0 +1,43 @@
+/* gosthash94-meta.c
+
+ Copyright (C) 2012 Nikos Mavrogiannopoulos, Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include <nettle/nettle-meta.h>
+
+#include "gosthash94.h"
+
+const struct nettle_hash nettle_gosthash94cp
+= _NETTLE_HASH(gosthash94cp, GOSTHASH94CP);
diff --git a/lib/nettle/gost/gosthash94.c b/lib/nettle/gost/gosthash94.c
new file mode 100644
index 0000000000..ec90ec80c0
--- /dev/null
+++ b/lib/nettle/gost/gosthash94.c
@@ -0,0 +1,374 @@
+/* gosthash94.c - an implementation of GOST Hash Function
+ *
+ * based on the Russian Standard GOST R 34.11-94.
+ * English description in RFC 5831.
+ * See also RFC 4357.
+ *
+ * Copyright: 2009-2012 Aleksey Kravchenko <rhash.admin@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Ported to nettle by Nikos Mavrogiannopoulos.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include <string.h>
+
+#include <nettle/macros.h>
+#include "nettle-write.h"
+#include "gosthash94.h"
+#include "gost28147.h"
+
+/**
+ * The core transformation. Process a 512-bit block.
+ *
+ * @param hash intermediate message hash
+ * @param block the message block to process
+ */
+static void
+gost_block_compress (struct gosthash94_ctx *ctx, const uint32_t *block,
+ const uint32_t *sbox)
+{
+ unsigned i;
+ uint32_t key[8], u[8], v[8], w[8], s[8];
+
+ /* u := hash, v := <256-bit message block> */
+ memcpy (u, ctx->hash, sizeof (u));
+ memcpy (v, block, sizeof (v));
+
+ /* w := u xor v */
+ w[0] = u[0] ^ v[0], w[1] = u[1] ^ v[1];
+ w[2] = u[2] ^ v[2], w[3] = u[3] ^ v[3];
+ w[4] = u[4] ^ v[4], w[5] = u[5] ^ v[5];
+ w[6] = u[6] ^ v[6], w[7] = u[7] ^ v[7];
+
+ /* calculate keys, encrypt hash and store result to the s[] array */
+ for (i = 0;; i += 2)
+ {
+ /* key generation: key_i := P(w) */
+ key[0] =
+ (w[0] & 0x000000ff) | ((w[2] & 0x000000ff) << 8) |
+ ((w[4] & 0x000000ff) << 16) | ((w[6] & 0x000000ff) << 24);
+ key[1] =
+ ((w[0] & 0x0000ff00) >> 8) | (w[2] & 0x0000ff00) |
+ ((w[4] & 0x0000ff00) << 8) | ((w[6] & 0x0000ff00) << 16);
+ key[2] =
+ ((w[0] & 0x00ff0000) >> 16) | ((w[2] & 0x00ff0000) >> 8) |
+ (w[4] & 0x00ff0000) | ((w[6] & 0x00ff0000) << 8);
+ key[3] =
+ ((w[0] & 0xff000000) >> 24) | ((w[2] & 0xff000000) >> 16) |
+ ((w[4] & 0xff000000) >> 8) | (w[6] & 0xff000000);
+ key[4] =
+ (w[1] & 0x000000ff) | ((w[3] & 0x000000ff) << 8) |
+ ((w[5] & 0x000000ff) << 16) | ((w[7] & 0x000000ff) << 24);
+ key[5] =
+ ((w[1] & 0x0000ff00) >> 8) | (w[3] & 0x0000ff00) |
+ ((w[5] & 0x0000ff00) << 8) | ((w[7] & 0x0000ff00) << 16);
+ key[6] =
+ ((w[1] & 0x00ff0000) >> 16) | ((w[3] & 0x00ff0000) >> 8) |
+ (w[5] & 0x00ff0000) | ((w[7] & 0x00ff0000) << 8);
+ key[7] =
+ ((w[1] & 0xff000000) >> 24) | ((w[3] & 0xff000000) >> 16) |
+ ((w[5] & 0xff000000) >> 8) | (w[7] & 0xff000000);
+
+ /* encryption: s_i := E_{key_i} (h_i) */
+ gost28147_encrypt_simple (key, sbox, &ctx->hash[i], &s[i]);
+
+ if (i == 0)
+ {
+ /* w:= A(u) ^ A^2(v) */
+ w[0] = u[2] ^ v[4], w[1] = u[3] ^ v[5];
+ w[2] = u[4] ^ v[6], w[3] = u[5] ^ v[7];
+ w[4] = u[6] ^ (v[0] ^= v[2]);
+ w[5] = u[7] ^ (v[1] ^= v[3]);
+ w[6] = (u[0] ^= u[2]) ^ (v[2] ^= v[4]);
+ w[7] = (u[1] ^= u[3]) ^ (v[3] ^= v[5]);
+ }
+ else if ((i & 2) != 0)
+ {
+ if (i == 6)
+ break;
+
+ /* w := A^2(u) xor A^4(v) xor C_3; u := A(u) xor C_3 */
+ /* C_3=0xff00ffff000000ffff0000ff00ffff0000ff00ff00ff00ffff00ff00ff00ff00 */
+ u[2] ^= u[4] ^ 0x000000ff;
+ u[3] ^= u[5] ^ 0xff00ffff;
+ u[4] ^= 0xff00ff00;
+ u[5] ^= 0xff00ff00;
+ u[6] ^= 0x00ff00ff;
+ u[7] ^= 0x00ff00ff;
+ u[0] ^= 0x00ffff00;
+ u[1] ^= 0xff0000ff;
+
+ w[0] = u[4] ^ v[0];
+ w[2] = u[6] ^ v[2];
+ w[4] = u[0] ^ (v[4] ^= v[6]);
+ w[6] = u[2] ^ (v[6] ^= v[0]);
+ w[1] = u[5] ^ v[1];
+ w[3] = u[7] ^ v[3];
+ w[5] = u[1] ^ (v[5] ^= v[7]);
+ w[7] = u[3] ^ (v[7] ^= v[1]);
+ }
+ else
+ {
+ /* i==4 here */
+ /* w:= A( A^2(u) xor C_3 ) xor A^6(v) */
+ w[0] = u[6] ^ v[4], w[1] = u[7] ^ v[5];
+ w[2] = u[0] ^ v[6], w[3] = u[1] ^ v[7];
+ w[4] = u[2] ^ (v[0] ^= v[2]);
+ w[5] = u[3] ^ (v[1] ^= v[3]);
+ w[6] = (u[4] ^= u[6]) ^ (v[2] ^= v[4]);
+ w[7] = (u[5] ^= u[7]) ^ (v[3] ^= v[5]);
+ }
+ }
+
+ /* step hash function: x(block, hash) := psi^61(hash xor psi(block xor psi^12(S))) */
+
+ /* 12 rounds of the LFSR and xor in <message block> */
+ u[0] = block[0] ^ s[6];
+ u[1] = block[1] ^ s[7];
+ u[2] =
+ block[2] ^ (s[0] << 16) ^ (s[0] >> 16) ^ (s[0] & 0xffff) ^ (s[1] &
+ 0xffff)
+ ^ (s[1] >> 16) ^ (s[2] << 16) ^ s[6] ^ (s[6] << 16) ^ (s[7] &
+ 0xffff0000)
+ ^ (s[7] >> 16);
+ u[3] =
+ block[3] ^ (s[0] & 0xffff) ^ (s[0] << 16) ^ (s[1] & 0xffff) ^ (s[1]
+ <<
+ 16)
+ ^ (s[1] >> 16) ^ (s[2] << 16) ^ (s[2] >> 16) ^ (s[3] << 16) ^ s[6]
+ ^ (s[6] << 16) ^ (s[6] >> 16) ^ (s[7] & 0xffff) ^ (s[7] << 16) ^
+ (s[7] >> 16);
+ u[4] =
+ block[4] ^ (s[0] & 0xffff0000) ^ (s[0] << 16) ^ (s[0] >> 16) ^
+ (s[1] & 0xffff0000) ^ (s[1] >> 16) ^ (s[2] << 16) ^ (s[2] >> 16) ^
+ (s[3] << 16) ^ (s[3] >> 16) ^ (s[4] << 16) ^ (s[6] << 16) ^ (s[6]
+ >> 16)
+ ^ (s[7] & 0xffff) ^ (s[7] << 16) ^ (s[7] >> 16);
+ u[5] =
+ block[5] ^ (s[0] << 16) ^ (s[0] >> 16) ^ (s[0] & 0xffff0000) ^
+ (s[1] & 0xffff) ^ s[2] ^ (s[2] >> 16) ^ (s[3] << 16) ^ (s[3] >> 16)
+ ^ (s[4] << 16) ^ (s[4] >> 16) ^ (s[5] << 16) ^ (s[6] << 16) ^ (s[6]
+ >>
+ 16)
+ ^ (s[7] & 0xffff0000) ^ (s[7] << 16) ^ (s[7] >> 16);
+ u[6] =
+ block[6] ^ s[0] ^ (s[1] >> 16) ^ (s[2] << 16) ^ s[3] ^ (s[3] >> 16)
+ ^ (s[4] << 16) ^ (s[4] >> 16) ^ (s[5] << 16) ^ (s[5] >> 16) ^ s[6]
+ ^ (s[6] << 16) ^ (s[6] >> 16) ^ (s[7] << 16);
+ u[7] =
+ block[7] ^ (s[0] & 0xffff0000) ^ (s[0] << 16) ^ (s[1] & 0xffff) ^
+ (s[1] << 16) ^ (s[2] >> 16) ^ (s[3] << 16) ^ s[4] ^ (s[4] >> 16) ^
+ (s[5] << 16) ^ (s[5] >> 16) ^ (s[6] >> 16) ^ (s[7] & 0xffff) ^
+ (s[7] << 16) ^ (s[7] >> 16);
+
+ /* 1 round of the LFSR (a mixing transformation) and xor with <hash> */
+ v[0] = ctx->hash[0] ^ (u[1] << 16) ^ (u[0] >> 16);
+ v[1] = ctx->hash[1] ^ (u[2] << 16) ^ (u[1] >> 16);
+ v[2] = ctx->hash[2] ^ (u[3] << 16) ^ (u[2] >> 16);
+ v[3] = ctx->hash[3] ^ (u[4] << 16) ^ (u[3] >> 16);
+ v[4] = ctx->hash[4] ^ (u[5] << 16) ^ (u[4] >> 16);
+ v[5] = ctx->hash[5] ^ (u[6] << 16) ^ (u[5] >> 16);
+ v[6] = ctx->hash[6] ^ (u[7] << 16) ^ (u[6] >> 16);
+ v[7] =
+ ctx->
+ hash[7] ^ (u[0] & 0xffff0000) ^ (u[0] << 16) ^ (u[1] & 0xffff0000)
+ ^ (u[1] << 16) ^ (u[6] << 16) ^ (u[7] & 0xffff0000) ^ (u[7] >> 16);
+
+ /* 61 rounds of LFSR, mixing up hash */
+ ctx->hash[0] = (v[0] & 0xffff0000) ^ (v[0] << 16) ^ (v[0] >> 16) ^
+ (v[1] >> 16) ^ (v[1] & 0xffff0000) ^ (v[2] << 16) ^
+ (v[3] >> 16) ^ (v[4] << 16) ^ (v[5] >> 16) ^ v[5] ^
+ (v[6] >> 16) ^ (v[7] << 16) ^ (v[7] >> 16) ^ (v[7] & 0xffff);
+ ctx->hash[1] = (v[0] << 16) ^ (v[0] >> 16) ^ (v[0] & 0xffff0000) ^
+ (v[1] & 0xffff) ^ v[2] ^ (v[2] >> 16) ^ (v[3] << 16) ^
+ (v[4] >> 16) ^ (v[5] << 16) ^ (v[6] << 16) ^ v[6] ^
+ (v[7] & 0xffff0000) ^ (v[7] >> 16);
+ ctx->hash[2] = (v[0] & 0xffff) ^ (v[0] << 16) ^ (v[1] << 16) ^
+ (v[1] >> 16) ^ (v[1] & 0xffff0000) ^ (v[2] << 16) ^ (v[3] >> 16) ^
+ v[3] ^ (v[4] << 16) ^ (v[5] >> 16) ^ v[6] ^ (v[6] >> 16) ^
+ (v[7] & 0xffff) ^ (v[7] << 16) ^ (v[7] >> 16);
+ ctx->hash[3] = (v[0] << 16) ^ (v[0] >> 16) ^ (v[0] & 0xffff0000) ^
+ (v[1] & 0xffff0000) ^ (v[1] >> 16) ^ (v[2] << 16) ^
+ (v[2] >> 16) ^ v[2] ^ (v[3] << 16) ^ (v[4] >> 16) ^ v[4] ^
+ (v[5] << 16) ^ (v[6] << 16) ^ (v[7] & 0xffff) ^ (v[7] >> 16);
+ ctx->hash[4] =
+ (v[0] >> 16) ^ (v[1] << 16) ^ v[1] ^ (v[2] >> 16) ^ v[2] ^ (v[3] <<
+ 16) ^
+ (v[3] >> 16) ^ v[3] ^ (v[4] << 16) ^ (v[5] >> 16) ^ v[5] ^ (v[6] <<
+ 16) ^
+ (v[6] >> 16) ^ (v[7] << 16);
+ ctx->hash[5] =
+ (v[0] << 16) ^ (v[0] & 0xffff0000) ^ (v[1] << 16) ^ (v[1] >> 16) ^
+ (v[1] & 0xffff0000) ^ (v[2] << 16) ^ v[2] ^ (v[3] >> 16) ^ v[3] ^
+ (v[4] << 16) ^ (v[4] >> 16) ^ v[4] ^ (v[5] << 16) ^ (v[6] << 16) ^
+ (v[6] >> 16) ^ v[6] ^ (v[7] << 16) ^ (v[7] >> 16) ^ (v[7] &
+ 0xffff0000);
+ ctx->hash[6] =
+ v[0] ^ v[2] ^ (v[2] >> 16) ^ v[3] ^ (v[3] << 16) ^ v[4] ^ (v[4] >>
+ 16) ^
+ (v[5] << 16) ^ (v[5] >> 16) ^ v[5] ^ (v[6] << 16) ^ (v[6] >> 16) ^
+ v[6] ^ (v[7] << 16) ^ v[7];
+ ctx->hash[7] =
+ v[0] ^ (v[0] >> 16) ^ (v[1] << 16) ^ (v[1] >> 16) ^ (v[2] << 16) ^
+ (v[3] >> 16) ^ v[3] ^ (v[4] << 16) ^ v[4] ^ (v[5] >> 16) ^ v[5] ^
+ (v[6] << 16) ^ (v[6] >> 16) ^ (v[7] << 16) ^ v[7];
+}
+
+/**
+ * This function calculates hash value by 256-bit blocks.
+ * It updates 256-bit check sum as follows:
+ * *(uint256_t)(ctx->sum) += *(uint256_t*)block;
+ * and then updates intermediate hash value ctx->hash
+ * by calling gost_block_compress().
+ *
+ * @param ctx algorithm context
+ * @param block the 256-bit message block to process
+ */
+static void
+gost_compute_sum_and_hash (struct gosthash94_ctx *ctx, const uint8_t *block,
+ const uint32_t *sbox)
+{
+ uint32_t block_le[8];
+ unsigned i, carry;
+
+ /* compute the 256-bit sum */
+ for (i = carry = 0; i < 8; i++, block += 4)
+ {
+ block_le[i] = LE_READ_UINT32(block);
+ ctx->sum[i] += carry;
+ carry = (ctx->sum[i] < carry);
+ ctx->sum[i] += block_le[i];
+ carry += (ctx->sum[i] < block_le[i]);
+ }
+
+ /* update message hash */
+ gost_block_compress (ctx, block_le, sbox);
+}
+
+/**
+ * Calculate message hash.
+ * Can be called repeatedly with chunks of the message to be hashed.
+ *
+ * @param ctx the algorithm context containing current hashing state
+ * @param msg message chunk
+ * @param size length of the message chunk
+ */
+static void
+gosthash94_update_int (struct gosthash94_ctx *ctx,
+ size_t length, const uint8_t *msg,
+ const uint32_t *sbox)
+{
+ unsigned index = (unsigned) ctx->length & 31;
+ ctx->length += length;
+
+ /* fill partial block */
+ if (index)
+ {
+ unsigned left = GOSTHASH94_BLOCK_SIZE - index;
+ memcpy (ctx->message + index, msg, (length < left ? length : left));
+ if (length < left)
+ return;
+
+ /* process partial block */
+ gost_compute_sum_and_hash (ctx, ctx->message, sbox);
+ msg += left;
+ length -= left;
+ }
+ while (length >= GOSTHASH94_BLOCK_SIZE)
+ {
+ gost_compute_sum_and_hash (ctx, msg, sbox);
+ msg += GOSTHASH94_BLOCK_SIZE;
+ length -= GOSTHASH94_BLOCK_SIZE;
+ }
+ if (length)
+ {
+ /* save leftovers */
+ memcpy (ctx->message, msg, length);
+ }
+}
+
+/**
+ * Calculate message hash.
+ * Can be called repeatedly with chunks of the message to be hashed.
+ *
+ * @param ctx the algorithm context containing current hashing state
+ * @param msg message chunk
+ * @param size length of the message chunk
+ */
+void
+gosthash94cp_update (struct gosthash94_ctx *ctx,
+ size_t length, const uint8_t *msg)
+{
+ gosthash94_update_int (ctx, length, msg,
+ gost28147_param_CryptoPro_3411.sbox);
+}
+
+/**
+ * Finish hashing and store message digest into given array.
+ *
+ * @param ctx the algorithm context containing current hashing state
+ * @param result calculated hash in binary form
+ */
+static void
+gosthash94_write_digest (struct gosthash94_ctx *ctx,
+ size_t length, uint8_t *result,
+ const uint32_t *sbox)
+{
+ unsigned index = ctx->length & 31;
+ uint32_t msg32[8];
+
+ assert(length <= GOSTHASH94_DIGEST_SIZE);
+
+ /* pad the last block with zeroes and hash it */
+ if (index > 0)
+ {
+ memset (ctx->message + index, 0, 32 - index);
+ gost_compute_sum_and_hash (ctx, ctx->message, sbox);
+ }
+
+ /* hash the message length and the sum */
+ msg32[0] = ctx->length << 3;
+ msg32[1] = ctx->length >> 29;
+ memset (msg32 + 2, 0, sizeof (uint32_t) * 6);
+
+ gost_block_compress (ctx, msg32, sbox);
+ gost_block_compress (ctx, ctx->sum, sbox);
+
+ /* convert hash state to result bytes */
+ _nettle_write_le32(length, result, ctx->hash);
+ gosthash94_init (ctx);
+}
+
+void
+gosthash94cp_digest (struct gosthash94_ctx *ctx,
+ size_t length, uint8_t *result)
+{
+ gosthash94_write_digest (ctx, length, result,
+ gost28147_param_CryptoPro_3411.sbox);
+}
diff --git a/lib/nettle/gost/gosthash94.h b/lib/nettle/gost/gosthash94.h
new file mode 100644
index 0000000000..fa6432e64d
--- /dev/null
+++ b/lib/nettle/gost/gosthash94.h
@@ -0,0 +1,95 @@
+/* gosthash94.h
+
+ The GOST R 34.11-94 hash function, described in RFC 5831.
+
+ Copyright (C) 2012 Nikos Mavrogiannopoulos, Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+/* Based on rhash gost.h. */
+
+/* Copyright: 2009-2012 Aleksey Kravchenko <rhash.admin@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Ported to nettle by Nikos Mavrogiannopoulos.
+ */
+
+#ifndef NETTLE_GOST_GOSTHASH94_H_INCLUDED
+#define NETTLE_GOST_GOSTHASH94_H_INCLUDED
+
+#include <nettle/nettle-types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <nettle/gosthash94.h>
+#include <nettle/nettle-meta.h>
+
+#define gosthash94cp_update _gnutls_gosthash94cp_update
+#define gosthash94cp_digest _gnutls_gosthash94cp_digest
+
+#define GOSTHASH94CP_BLOCK_SIZE GOSTHASH94_BLOCK_SIZE
+#define GOSTHASH94CP_DIGEST_SIZE GOSTHASH94_DIGEST_SIZE
+
+#define gosthash94cp_ctx gosthash94_ctx
+
+#define gosthash94cp_init gosthash94_init
+void gosthash94cp_update(struct gosthash94_ctx *ctx,
+ size_t length, const uint8_t *msg);
+void gosthash94cp_digest(struct gosthash94_ctx *ctx,
+ size_t length, uint8_t *result);
+
+#define nettle_gosthash94cp _gnutls_gosthash94cp
+extern const struct nettle_hash _gnutls_gosthash94cp;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NETTLE_GOST_GOSTHASH94_H_INCLUDED */
diff --git a/lib/nettle/gost/hmac-gost.h b/lib/nettle/gost/hmac-gost.h
new file mode 100644
index 0000000000..0e4d05f184
--- /dev/null
+++ b/lib/nettle/gost/hmac-gost.h
@@ -0,0 +1,103 @@
+/* hmac-gost.h
+
+ HMAC message authentication code (RFC-2104).
+
+ Copyright (C) 2001, 2002 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#ifndef NETTLE_HMAC_GOST_H_INCLUDED
+#define NETTLE_HMAC_GOST_H_INCLUDED
+
+#include <nettle/hmac.h>
+
+#include "gosthash94.h"
+#include "streebog.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Namespace mangling */
+#define hmac_gosthash94cp_set_key _gnutls_hmac_gosthash94cp_set_key
+#define hmac_gosthash94cp_update _gnutls_hmac_gosthash94cp_update
+#define hmac_gosthash94cp_digest _gnutls_hmac_gosthash94cp_digest
+#define hmac_streebog256_set_key _gnutls_hmac_streebog256_set_key
+#define hmac_streebog256_digest _gnutls_hmac_streebog256_digest
+#define hmac_streebog512_set_key _gnutls_hmac_streebog512_set_key
+#define hmac_streebog512_update _gnutls_hmac_streebog512_update
+#define hmac_streebog512_digest _gnutls_hmac_streebog512_digest
+
+/* hmac-gosthash94 */
+struct hmac_gosthash94cp_ctx HMAC_CTX(struct gosthash94cp_ctx);
+
+void
+hmac_gosthash94cp_set_key(struct hmac_gosthash94cp_ctx *ctx,
+ size_t key_length, const uint8_t *key);
+
+void
+hmac_gosthash94cp_update(struct hmac_gosthash94cp_ctx *ctx,
+ size_t length, const uint8_t *data);
+
+void
+hmac_gosthash94cp_digest(struct hmac_gosthash94cp_ctx *ctx,
+ size_t length, uint8_t *digest);
+
+
+/* hmac-streebog */
+struct hmac_streebog512_ctx HMAC_CTX(struct streebog512_ctx);
+
+void
+hmac_streebog512_set_key(struct hmac_streebog512_ctx *ctx,
+ size_t key_length, const uint8_t *key);
+
+void
+hmac_streebog512_update(struct hmac_streebog512_ctx *ctx,
+ size_t length, const uint8_t *data);
+
+void
+hmac_streebog512_digest(struct hmac_streebog512_ctx *ctx,
+ size_t length, uint8_t *digest);
+
+#define hmac_streebog256_ctx hmac_streebog512_ctx
+
+void
+hmac_streebog256_set_key(struct hmac_streebog256_ctx *ctx,
+ size_t key_length, const uint8_t *key);
+
+#define hmac_streebog256_update hmac_streebog512_update
+
+void
+hmac_streebog256_digest(struct hmac_streebog256_ctx *ctx,
+ size_t length, uint8_t *digest);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NETTLE_HMAC_GOST_H_INCLUDED */
diff --git a/lib/nettle/gost/hmac-gosthash94.c b/lib/nettle/gost/hmac-gosthash94.c
new file mode 100644
index 0000000000..e0f4a5f4cf
--- /dev/null
+++ b/lib/nettle/gost/hmac-gosthash94.c
@@ -0,0 +1,62 @@
+/* hmac-gosthash94.c
+
+ HMAC-GOSTHASH94 message authentication code.
+
+ Copyright (C) 2016 Dmitry Eremin-Solenikov
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gnutls_int.h>
+
+#include <nettle/hmac.h>
+#include "hmac-gost.h"
+#include "gosthash94.h"
+
+void
+hmac_gosthash94cp_set_key(struct hmac_gosthash94cp_ctx *ctx,
+ size_t key_length, const uint8_t *key)
+{
+ HMAC_SET_KEY(ctx, &nettle_gosthash94cp, key_length, key);
+}
+
+void
+hmac_gosthash94cp_update(struct hmac_gosthash94cp_ctx *ctx,
+ size_t length, const uint8_t *data)
+{
+ gosthash94cp_update(&ctx->state, length, data);
+}
+void
+hmac_gosthash94cp_digest(struct hmac_gosthash94cp_ctx *ctx,
+ size_t length, uint8_t *digest)
+{
+ HMAC_DIGEST(ctx, &nettle_gosthash94cp, length, digest);
+}
diff --git a/lib/nettle/gost/hmac-streebog.c b/lib/nettle/gost/hmac-streebog.c
new file mode 100644
index 0000000000..475a8ebf97
--- /dev/null
+++ b/lib/nettle/gost/hmac-streebog.c
@@ -0,0 +1,76 @@
+/* hmac-streebog.c
+
+ HMAC-Streebog message authentication code.
+
+ Copyright (C) 2016 Dmitry Eremin-Solenikov
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gnutls_int.h>
+
+#include <nettle/hmac.h>
+#include "hmac-gost.h"
+
+void
+hmac_streebog512_set_key(struct hmac_streebog512_ctx *ctx,
+ size_t key_length, const uint8_t *key)
+{
+ HMAC_SET_KEY(ctx, &nettle_streebog512, key_length, key);
+}
+
+void
+hmac_streebog512_update(struct hmac_streebog512_ctx *ctx,
+ size_t length, const uint8_t *data)
+{
+ streebog512_update(&ctx->state, length, data);
+}
+
+void
+hmac_streebog512_digest(struct hmac_streebog512_ctx *ctx,
+ size_t length, uint8_t *digest)
+{
+ HMAC_DIGEST(ctx, &nettle_streebog512, length, digest);
+}
+
+void
+hmac_streebog256_set_key(struct hmac_streebog256_ctx *ctx,
+ size_t key_length, const uint8_t *key)
+{
+ HMAC_SET_KEY(ctx, &nettle_streebog256, key_length, key);
+}
+
+void
+hmac_streebog256_digest(struct hmac_streebog256_ctx *ctx,
+ size_t length, uint8_t *digest)
+{
+ HMAC_DIGEST(ctx, &nettle_streebog256, length, digest);
+}
diff --git a/lib/nettle/gost/nettle-internal.h b/lib/nettle/gost/nettle-internal.h
new file mode 100644
index 0000000000..899ec4700b
--- /dev/null
+++ b/lib/nettle/gost/nettle-internal.h
@@ -0,0 +1,52 @@
+/* nettle-internal.h
+
+ Things that are used only by the testsuite and benchmark, and
+ not included in the library.
+
+ Copyright (C) 2002, 2014 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#ifndef NETTLE_INTERNAL_H_INCLUDED
+#define NETTLE_INTERNAL_H_INCLUDED
+
+/* Temporary allocation, for systems that don't support alloca. Note
+ * that the allocation requests should always be reasonably small, so
+ * that they can fit on the stack. For non-alloca systems, we use a
+ * fix maximum size, and abort if we ever need anything larger. */
+
+#if HAVE_ALLOCA
+# define TMP_DECL(name, type, max) type *name
+# define TMP_ALLOC(name, size) (name = alloca(sizeof (*name) * (size)))
+#else /* !HAVE_ALLOCA */
+# define TMP_DECL(name, type, max) type name[max]
+# define TMP_ALLOC(name, size) \
+ do { if ((size) > (sizeof(name) / sizeof(name[0]))) abort(); } while (0)
+#endif
+
+#endif /* NETTLE_INTERNAL_H_INCLUDED */
diff --git a/lib/nettle/gost/nettle-write.h b/lib/nettle/gost/nettle-write.h
new file mode 100644
index 0000000000..c50c427200
--- /dev/null
+++ b/lib/nettle/gost/nettle-write.h
@@ -0,0 +1,58 @@
+/* nettle-write.h
+
+ Internal functions to write out word-sized data to byte arrays.
+
+ Copyright (C) 2010 Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#ifndef NETTLE_WRITE_H_INCLUDED
+#define NETTLE_WRITE_H_INCLUDED
+
+/* For size_t */
+#include <stddef.h>
+
+#include <nettle/nettle-stdint.h>
+
+/* Write the word array at SRC to the byte array at DST, using little
+ endian (le) or big endian (be) byte order, and truncating the
+ result to LENGTH bytes. */
+
+/* FIXME: Use a macro shortcut to memcpy for native endianness. */
+void
+_nettle_write_be32(size_t length, uint8_t *dst,
+ const uint32_t *src);
+void
+_nettle_write_le32(size_t length, uint8_t *dst,
+ const uint32_t *src);
+
+void
+_nettle_write_le64(size_t length, uint8_t *dst,
+ const uint64_t *src);
+
+#endif /* NETTLE_WRITE_H_INCLUDED */
diff --git a/lib/nettle/gost/pbkdf2-gost.h b/lib/nettle/gost/pbkdf2-gost.h
new file mode 100644
index 0000000000..793c25725f
--- /dev/null
+++ b/lib/nettle/gost/pbkdf2-gost.h
@@ -0,0 +1,72 @@
+/* pbkdf2.h
+
+ PKCS #5 password-based key derivation function PBKDF2, see RFC 2898.
+
+ Copyright (C) 2012 Simon Josefsson
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#ifndef NETTLE_PBKDF2_GOST_H_INCLUDED
+#define NETTLE_PBKDF2_GOST_H_INCLUDED
+
+#include <nettle/nettle-meta.h>
+#include <nettle/pbkdf2.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Namespace mangling */
+#define pbkdf2_hmac_gosthash94cp _gnutls_pbkdf2_hmac_gosthash94cp
+#define pbkdf2_hmac_streebog256 _gnutls_pbkdf2_hmac_streebog256
+#define pbkdf2_hmac_streebog512 _gnutls_pbkdf2_hmac_streebog512
+
+void
+pbkdf2_hmac_gosthash94cp (size_t key_length, const uint8_t *key,
+ unsigned iterations,
+ size_t salt_length, const uint8_t *salt,
+ size_t length, uint8_t *dst);
+
+void
+pbkdf2_hmac_streebog256 (size_t key_length, const uint8_t *key,
+ unsigned iterations,
+ size_t salt_length, const uint8_t *salt,
+ size_t length, uint8_t *dst);
+
+void
+pbkdf2_hmac_streebog512 (size_t key_length, const uint8_t *key,
+ unsigned iterations,
+ size_t salt_length, const uint8_t *salt,
+ size_t length, uint8_t *dst);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NETTLE_PBKDF2_GOST_H_INCLUDED */
diff --git a/lib/nettle/gost/pbkdf2-hmac-gosthash94.c b/lib/nettle/gost/pbkdf2-hmac-gosthash94.c
new file mode 100644
index 0000000000..60891c4e35
--- /dev/null
+++ b/lib/nettle/gost/pbkdf2-hmac-gosthash94.c
@@ -0,0 +1,56 @@
+/* pbkdf2-hmac-gosthash94.c
+
+ PKCS #5 PBKDF2 used with HMAC-GOSTHASH94CP.
+
+ Copyright (C) 2016 Dmitry Eremin-Solenikov
+ Copyright (C) 2012 Simon Josefsson
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include "pbkdf2-gost.h"
+
+#include "hmac-gost.h"
+
+void
+pbkdf2_hmac_gosthash94cp (size_t key_length, const uint8_t *key,
+ unsigned iterations,
+ size_t salt_length, const uint8_t *salt,
+ size_t length, uint8_t *dst)
+{
+ struct hmac_gosthash94cp_ctx gosthash94cpctx;
+
+ hmac_gosthash94cp_set_key (&gosthash94cpctx, key_length, key);
+ PBKDF2 (&gosthash94cpctx, hmac_gosthash94cp_update, hmac_gosthash94cp_digest,
+ GOSTHASH94CP_DIGEST_SIZE, iterations, salt_length, salt, length, dst);
+}
diff --git a/lib/nettle/gost/pbkdf2-hmac-streebog.c b/lib/nettle/gost/pbkdf2-hmac-streebog.c
new file mode 100644
index 0000000000..00503c917a
--- /dev/null
+++ b/lib/nettle/gost/pbkdf2-hmac-streebog.c
@@ -0,0 +1,69 @@
+/* pbkdf2-hmac-streebog.c
+
+ PKCS #5 PBKDF2 used with HMAC-STREEBOG.
+
+ Copyright (C) 2016 Dmitry Eremin-Solenikov
+ Copyright (C) 2012 Simon Josefsson
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include "pbkdf2-gost.h"
+
+#include "hmac-gost.h"
+
+void
+pbkdf2_hmac_streebog256 (size_t key_length, const uint8_t *key,
+ unsigned iterations,
+ size_t salt_length, const uint8_t *salt,
+ size_t length, uint8_t *dst)
+{
+ struct hmac_streebog256_ctx streebog256ctx;
+
+ hmac_streebog256_set_key (&streebog256ctx, key_length, key);
+ PBKDF2 (&streebog256ctx, hmac_streebog256_update, hmac_streebog256_digest,
+ STREEBOG256_DIGEST_SIZE, iterations, salt_length, salt, length, dst);
+}
+
+void
+pbkdf2_hmac_streebog512 (size_t key_length, const uint8_t *key,
+ unsigned iterations,
+ size_t salt_length, const uint8_t *salt,
+ size_t length, uint8_t *dst)
+{
+ struct hmac_streebog512_ctx streebog512ctx;
+
+ hmac_streebog512_set_key (&streebog512ctx, key_length, key);
+ PBKDF2 (&streebog512ctx, hmac_streebog512_update, hmac_streebog512_digest,
+ STREEBOG512_DIGEST_SIZE, iterations, salt_length, salt, length, dst);
+}
diff --git a/lib/nettle/gost/streebog-meta.c b/lib/nettle/gost/streebog-meta.c
new file mode 100644
index 0000000000..c83b14ddb4
--- /dev/null
+++ b/lib/nettle/gost/streebog-meta.c
@@ -0,0 +1,46 @@
+/* streebog-meta.c
+
+ Copyright (C) 2012 Nikos Mavrogiannopoulos, Niels Möller
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include <nettle/nettle-meta.h>
+
+#include "streebog.h"
+
+const struct nettle_hash nettle_streebog512
+= _NETTLE_HASH(streebog512, STREEBOG512);
+
+const struct nettle_hash nettle_streebog256
+= _NETTLE_HASH(streebog256, STREEBOG256);
diff --git a/lib/nettle/gost/streebog.c b/lib/nettle/gost/streebog.c
new file mode 100644
index 0000000000..24eb7994e5
--- /dev/null
+++ b/lib/nettle/gost/streebog.c
@@ -0,0 +1,1333 @@
+/* streebog.c - GOST R 34.11-2012 (Streebog) hash function
+
+ Copyright (C) 2013-2015 Dmitry Eremin-Solenikov
+
+ Based on my code in libgcrypt.
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+ */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gnutls_int.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "streebog.h"
+
+#include <nettle/macros.h>
+#include "nettle-write.h"
+
+
+/* Pre-computed results of multiplication of bytes on A and reordered with
+ Pi[]. */
+static const uint64_t streebog_table[8][256] =
+{
+ /* 0 */
+ { 0xd01f715b5c7ef8e6ULL, 0x16fa240980778325ULL,
+ 0xa8a42e857ee049c8ULL, 0x6ac1068fa186465bULL,
+ 0x6e417bd7a2e9320bULL, 0x665c8167a437daabULL,
+ 0x7666681aa89617f6ULL, 0x4b959163700bdcf5ULL,
+ 0xf14be6b78df36248ULL, 0xc585bd689a625cffULL,
+ 0x9557d7fca67d82cbULL, 0x89f0b969af6dd366ULL,
+ 0xb0833d48749f6c35ULL, 0xa1998c23b1ecbc7cULL,
+ 0x8d70c431ac02a736ULL, 0xd6dfbc2fd0a8b69eULL,
+ 0x37aeb3e551fa198bULL, 0x0b7d128a40b5cf9cULL,
+ 0x5a8f2008b5780cbcULL, 0xedec882284e333e5ULL,
+ 0xd25fc177d3c7c2ceULL, 0x5e0f5d50b61778ecULL,
+ 0x1d873683c0c24cb9ULL, 0xad040bcbb45d208cULL,
+ 0x2f89a0285b853c76ULL, 0x5732fff6791b8d58ULL,
+ 0x3e9311439ef6ec3fULL, 0xc9183a809fd3c00fULL,
+ 0x83adf3f5260a01eeULL, 0xa6791941f4e8ef10ULL,
+ 0x103ae97d0ca1cd5dULL, 0x2ce948121dee1b4aULL,
+ 0x39738421dbf2bf53ULL, 0x093da2a6cf0cf5b4ULL,
+ 0xcd9847d89cbcb45fULL, 0xf9561c078b2d8ae8ULL,
+ 0x9c6a755a6971777fULL, 0xbc1ebaa0712ef0c5ULL,
+ 0x72e61542abf963a6ULL, 0x78bb5fde229eb12eULL,
+ 0x14ba94250fceb90dULL, 0x844d6697630e5282ULL,
+ 0x98ea08026a1e032fULL, 0xf06bbea144217f5cULL,
+ 0xdb6263d11ccb377aULL, 0x641c314b2b8ee083ULL,
+ 0x320e96ab9b4770cfULL, 0x1ee7deb986a96b85ULL,
+ 0xe96cf57a878c47b5ULL, 0xfdd6615f8842feb8ULL,
+ 0xc83862965601dd1bULL, 0x2ea9f83e92572162ULL,
+ 0xf876441142ff97fcULL, 0xeb2c455608357d9dULL,
+ 0x5612a7e0b0c9904cULL, 0x6c01cbfb2d500823ULL,
+ 0x4548a6a7fa037a2dULL, 0xabc4c6bf388b6ef4ULL,
+ 0xbade77d4fdf8bebdULL, 0x799b07c8eb4cac3aULL,
+ 0x0c9d87e805b19cf0ULL, 0xcb588aac106afa27ULL,
+ 0xea0c1d40c1e76089ULL, 0x2869354a1e816f1aULL,
+ 0xff96d17307fbc490ULL, 0x9f0a9d602f1a5043ULL,
+ 0x96373fc6e016a5f7ULL, 0x5292dab8b3a6e41cULL,
+ 0x9b8ae0382c752413ULL, 0x4f15ec3b7364a8a5ULL,
+ 0x3fb349555724f12bULL, 0xc7c50d4415db66d7ULL,
+ 0x92b7429ee379d1a7ULL, 0xd37f99611a15dfdaULL,
+ 0x231427c05e34a086ULL, 0xa439a96d7b51d538ULL,
+ 0xb403401077f01865ULL, 0xdda2aea5901d7902ULL,
+ 0x0a5d4a9c8967d288ULL, 0xc265280adf660f93ULL,
+ 0x8bb0094520d4e94eULL, 0x2a29856691385532ULL,
+ 0x42a833c5bf072941ULL, 0x73c64d54622b7eb2ULL,
+ 0x07e095624504536cULL, 0x8a905153e906f45aULL,
+ 0x6f6123c16b3b2f1fULL, 0xc6e55552dc097bc3ULL,
+ 0x4468feb133d16739ULL, 0xe211e7f0c7398829ULL,
+ 0xa2f96419f7879b40ULL, 0x19074bdbc3ad38e9ULL,
+ 0xf4ebc3f9474e0b0cULL, 0x43886bd376d53455ULL,
+ 0xd8028beb5aa01046ULL, 0x51f23282f5cdc320ULL,
+ 0xe7b1c2be0d84e16dULL, 0x081dfab006dee8a0ULL,
+ 0x3b33340d544b857bULL, 0x7f5bcabc679ae242ULL,
+ 0x0edd37c48a08a6d8ULL, 0x81ed43d9a9b33bc6ULL,
+ 0xb1a3655ebd4d7121ULL, 0x69a1eeb5e7ed6167ULL,
+ 0xf6ab73d5c8f73124ULL, 0x1a67a3e185c61fd5ULL,
+ 0x2dc91004d43c065eULL, 0x0240b02c8fb93a28ULL,
+ 0x90f7f2b26cc0eb8fULL, 0x3cd3a16f114fd617ULL,
+ 0xaae49ea9f15973e0ULL, 0x06c0cd748cd64e78ULL,
+ 0xda423bc7d5192a6eULL, 0xc345701c16b41287ULL,
+ 0x6d2193ede4821537ULL, 0xfcf639494190e3acULL,
+ 0x7c3b228621f1c57eULL, 0xfb16ac2b0494b0c0ULL,
+ 0xbf7e529a3745d7f9ULL, 0x6881b6a32e3f7c73ULL,
+ 0xca78d2bad9b8e733ULL, 0xbbfe2fc2342aa3a9ULL,
+ 0x0dbddffecc6381e4ULL, 0x70a6a56e2440598eULL,
+ 0xe4d12a844befc651ULL, 0x8c509c2765d0ba22ULL,
+ 0xee8c6018c28814d9ULL, 0x17da7c1f49a59e31ULL,
+ 0x609c4c1328e194d3ULL, 0xb3e3d57232f44b09ULL,
+ 0x91d7aaa4a512f69bULL, 0x0ffd6fd243dabbccULL,
+ 0x50d26a943c1fde34ULL, 0x6be15e9968545b4fULL,
+ 0x94778fea6faf9fdfULL, 0x2b09dd7058ea4826ULL,
+ 0x677cd9716de5c7bfULL, 0x49d5214fffb2e6ddULL,
+ 0x0360e83a466b273cULL, 0x1fc786af4f7b7691ULL,
+ 0xa0b9d435783ea168ULL, 0xd49f0c035f118cb6ULL,
+ 0x01205816c9d21d14ULL, 0xac2453dd7d8f3d98ULL,
+ 0x545217cc3f70aa64ULL, 0x26b4028e9489c9c2ULL,
+ 0xdec2469fd6765e3eULL, 0x04807d58036f7450ULL,
+ 0xe5f17292823ddb45ULL, 0xf30b569b024a5860ULL,
+ 0x62dcfc3fa758aefbULL, 0xe84cad6c4e5e5aa1ULL,
+ 0xccb81fce556ea94bULL, 0x53b282ae7a74f908ULL,
+ 0x1b47fbf74c1402c1ULL, 0x368eebf39828049fULL,
+ 0x7afbeff2ad278b06ULL, 0xbe5e0a8cfe97caedULL,
+ 0xcfd8f7f413058e77ULL, 0xf78b2bc301252c30ULL,
+ 0x4d555c17fcdd928dULL, 0x5f2f05467fc565f8ULL,
+ 0x24f4b2a21b30f3eaULL, 0x860dd6bbecb768aaULL,
+ 0x4c750401350f8f99ULL, 0x0000000000000000ULL,
+ 0xecccd0344d312ef1ULL, 0xb5231806be220571ULL,
+ 0xc105c030990d28afULL, 0x653c695de25cfd97ULL,
+ 0x159acc33c61ca419ULL, 0xb89ec7f872418495ULL,
+ 0xa9847693b73254dcULL, 0x58cf90243ac13694ULL,
+ 0x59efc832f3132b80ULL, 0x5c4fed7c39ae42c4ULL,
+ 0x828dabe3efd81cfaULL, 0xd13f294d95ace5f2ULL,
+ 0x7d1b7a90e823d86aULL, 0xb643f03cf849224dULL,
+ 0x3df3f979d89dcb03ULL, 0x7426d836272f2ddeULL,
+ 0xdfe21e891fa4432aULL, 0x3a136c1b9d99986fULL,
+ 0xfa36f43dcd46add4ULL, 0xc025982650df35bbULL,
+ 0x856d3e81aadc4f96ULL, 0xc4a5e57e53b041ebULL,
+ 0x4708168b75ba4005ULL, 0xaf44bbe73be41aa4ULL,
+ 0x971767d029c4b8e3ULL, 0xb9be9feebb939981ULL,
+ 0x215497ecd18d9aaeULL, 0x316e7e91dd2c57f3ULL,
+ 0xcef8afe2dad79363ULL, 0x3853dc371220a247ULL,
+ 0x35ee03c9de4323a3ULL, 0xe6919aa8c456fc79ULL,
+ 0xe05157dc4880b201ULL, 0x7bdbb7e464f59612ULL,
+ 0x127a59518318f775ULL, 0x332ecebd52956ddbULL,
+ 0x8f30741d23bb9d1eULL, 0xd922d3fd93720d52ULL,
+ 0x7746300c61440ae2ULL, 0x25d4eab4d2e2eefeULL,
+ 0x75068020eefd30caULL, 0x135a01474acaea61ULL,
+ 0x304e268714fe4ae7ULL, 0xa519f17bb283c82cULL,
+ 0xdc82f6b359cf6416ULL, 0x5baf781e7caa11a8ULL,
+ 0xb2c38d64fb26561dULL, 0x34ce5bdf17913eb7ULL,
+ 0x5d6fb56af07c5fd0ULL, 0x182713cd0a7f25fdULL,
+ 0x9e2ac576e6c84d57ULL, 0x9aaab82ee5a73907ULL,
+ 0xa3d93c0f3e558654ULL, 0x7e7b92aaae48ff56ULL,
+ 0x872d8ead256575beULL, 0x41c8dbfff96c0e7dULL,
+ 0x99ca5014a3cc1e3bULL, 0x40e883e930be1369ULL,
+ 0x1ca76e95091051adULL, 0x4e35b42dbab6b5b1ULL,
+ 0x05a0254ecabd6944ULL, 0xe1710fca8152af15ULL,
+ 0xf22b0e8dcb984574ULL, 0xb763a82a319b3f59ULL,
+ 0x63fca4296e8ab3efULL, 0x9d4a2d4ca0a36a6bULL,
+ 0xe331bfe60eeb953dULL, 0xd5bf541596c391a2ULL,
+ 0xf5cb9bef8e9c1618ULL, 0x46284e9dbc685d11ULL,
+ 0x2074cffa185f87baULL, 0xbd3ee2b6b8fcedd1ULL,
+ 0xae64e3f1f23607b0ULL, 0xfeb68965ce29d984ULL,
+ 0x55724fdaf6a2b770ULL, 0x29496d5cd753720eULL,
+ 0xa75941573d3af204ULL, 0x8e102c0bea69800aULL,
+ 0x111ab16bc573d049ULL, 0xd7ffe439197aab8aULL,
+ 0xefac380e0b5a09cdULL, 0x48f579593660fbc9ULL,
+ 0x22347fd697e6bd92ULL, 0x61bc1405e13389c7ULL,
+ 0x4ab5c975b9d9c1e1ULL, 0x80cd1bcf606126d2ULL,
+ 0x7186fd78ed92449aULL, 0x93971a882aabccb3ULL,
+ 0x88d0e17f66bfce72ULL, 0x27945a985d5bd4d6ULL },
+ /* 1 */
+ { 0xde553f8c05a811c8ULL, 0x1906b59631b4f565ULL,
+ 0x436e70d6b1964ff7ULL, 0x36d343cb8b1e9d85ULL,
+ 0x843dfacc858aab5aULL, 0xfdfc95c299bfc7f9ULL,
+ 0x0f634bdea1d51fa2ULL, 0x6d458b3b76efb3cdULL,
+ 0x85c3f77cf8593f80ULL, 0x3c91315fbe737cb2ULL,
+ 0x2148b03366ace398ULL, 0x18f8b8264c6761bfULL,
+ 0xc830c1c495c9fb0fULL, 0x981a76102086a0aaULL,
+ 0xaa16012142f35760ULL, 0x35cc54060c763cf6ULL,
+ 0x42907d66cc45db2dULL, 0x8203d44b965af4bcULL,
+ 0x3d6f3cefc3a0e868ULL, 0xbc73ff69d292bda7ULL,
+ 0x8722ed0102e20a29ULL, 0x8f8185e8cd34deb7ULL,
+ 0x9b0561dda7ee01d9ULL, 0x5335a0193227fad6ULL,
+ 0xc9cecc74e81a6fd5ULL, 0x54f5832e5c2431eaULL,
+ 0x99e47ba05d553470ULL, 0xf7bee756acd226ceULL,
+ 0x384e05a5571816fdULL, 0xd1367452a47d0e6aULL,
+ 0xf29fde1c386ad85bULL, 0x320c77316275f7caULL,
+ 0xd0c879e2d9ae9ab0ULL, 0xdb7406c69110ef5dULL,
+ 0x45505e51a2461011ULL, 0xfc029872e46c5323ULL,
+ 0xfa3cb6f5f7bc0cc5ULL, 0x031f17cd8768a173ULL,
+ 0xbd8df2d9af41297dULL, 0x9d3b4f5ab43e5e3fULL,
+ 0x4071671b36feee84ULL, 0x716207e7d3e3b83dULL,
+ 0x48d20ff2f9283a1aULL, 0x27769eb4757cbc7eULL,
+ 0x5c56ebc793f2e574ULL, 0xa48b474f9ef5dc18ULL,
+ 0x52cbada94ff46e0cULL, 0x60c7da982d8199c6ULL,
+ 0x0e9d466edc068b78ULL, 0x4eec2175eaf865fcULL,
+ 0x550b8e9e21f7a530ULL, 0x6b7ba5bc653fec2bULL,
+ 0x5eb7f1ba6949d0ddULL, 0x57ea94e3db4c9099ULL,
+ 0xf640eae6d101b214ULL, 0xdd4a284182c0b0bbULL,
+ 0xff1d8fbf6304f250ULL, 0xb8accb933bf9d7e8ULL,
+ 0xe8867c478eb68c4dULL, 0x3f8e2692391bddc1ULL,
+ 0xcb2fd60912a15a7cULL, 0xaec935dbab983d2fULL,
+ 0xf55ffd2b56691367ULL, 0x80e2ce366ce1c115ULL,
+ 0x179bf3f8edb27e1dULL, 0x01fe0db07dd394daULL,
+ 0xda8a0b76ecc37b87ULL, 0x44ae53e1df9584cbULL,
+ 0xb310b4b77347a205ULL, 0xdfab323c787b8512ULL,
+ 0x3b511268d070b78eULL, 0x65e6e3d2b9396753ULL,
+ 0x6864b271e2574d58ULL, 0x259784c98fc789d7ULL,
+ 0x02e11a7dfabb35a9ULL, 0x8841a6dfa337158bULL,
+ 0x7ade78c39b5dcdd0ULL, 0xb7cf804d9a2cc84aULL,
+ 0x20b6bd831b7f7742ULL, 0x75bd331d3a88d272ULL,
+ 0x418f6aab4b2d7a5eULL, 0xd9951cbb6babdaf4ULL,
+ 0xb6318dfde7ff5c90ULL, 0x1f389b112264aa83ULL,
+ 0x492c024284fbaec0ULL, 0xe33a0363c608f9a0ULL,
+ 0x2688930408af28a4ULL, 0xc7538a1a341ce4adULL,
+ 0x5da8e677ee2171aeULL, 0x8c9e92254a5c7fc4ULL,
+ 0x63d8cd55aae938b5ULL, 0x29ebd8daa97a3706ULL,
+ 0x959827b37be88aa1ULL, 0x1484e4356adadf6eULL,
+ 0xa7945082199d7d6bULL, 0xbf6ce8a455fa1cd4ULL,
+ 0x9cc542eac9edcae5ULL, 0x79c16f0e1c356ca3ULL,
+ 0x89bfab6fdee48151ULL, 0xd4174d1830c5f0ffULL,
+ 0x9258048415eb419dULL, 0x6139d72850520d1cULL,
+ 0x6a85a80c18ec78f1ULL, 0xcd11f88e0171059aULL,
+ 0xcceff53e7ca29140ULL, 0xd229639f2315af19ULL,
+ 0x90b91ef9ef507434ULL, 0x5977d28d074a1be1ULL,
+ 0x311360fce51d56b9ULL, 0xc093a92d5a1f2f91ULL,
+ 0x1a19a25bb6dc5416ULL, 0xeb996b8a09de2d3eULL,
+ 0xfee3820f1ed7668aULL, 0xd7085ad5b7ad518cULL,
+ 0x7fff41890fe53345ULL, 0xec5948bd67dde602ULL,
+ 0x2fd5f65dbaaa68e0ULL, 0xa5754affe32648c2ULL,
+ 0xf8ddac880d07396cULL, 0x6fa491468c548664ULL,
+ 0x0c7c5c1326bdbed1ULL, 0x4a33158f03930fb3ULL,
+ 0x699abfc19f84d982ULL, 0xe4fa2054a80b329cULL,
+ 0x6707f9af438252faULL, 0x08a368e9cfd6d49eULL,
+ 0x47b1442c58fd25b8ULL, 0xbbb3dc5ebc91769bULL,
+ 0x1665fe489061eac7ULL, 0x33f27a811fa66310ULL,
+ 0x93a609346838d547ULL, 0x30ed6d4c98cec263ULL,
+ 0x1dd9816cd8df9f2aULL, 0x94662a03063b1e7bULL,
+ 0x83fdd9fbeb896066ULL, 0x7b207573e68e590aULL,
+ 0x5f49fc0a149a4407ULL, 0x343259b671a5a82cULL,
+ 0xfbc2bb458a6f981fULL, 0xc272b350a0a41a38ULL,
+ 0x3aaf1fd8ada32354ULL, 0x6cbb868b0b3c2717ULL,
+ 0xa2b569c88d2583feULL, 0xf180c9d1bf027928ULL,
+ 0xaf37386bd64ba9f5ULL, 0x12bacab2790a8088ULL,
+ 0x4c0d3b0810435055ULL, 0xb2eeb9070e9436dfULL,
+ 0xc5b29067cea7d104ULL, 0xdcb425f1ff132461ULL,
+ 0x4f122cc5972bf126ULL, 0xac282fa651230886ULL,
+ 0xe7e537992f6393efULL, 0xe61b3a2952b00735ULL,
+ 0x709c0a57ae302ce7ULL, 0xe02514ae416058d3ULL,
+ 0xc44c9dd7b37445deULL, 0x5a68c5408022ba92ULL,
+ 0x1c278cdca50c0bf0ULL, 0x6e5a9cf6f18712beULL,
+ 0x86dce0b17f319ef3ULL, 0x2d34ec2040115d49ULL,
+ 0x4bcd183f7e409b69ULL, 0x2815d56ad4a9a3dcULL,
+ 0x24698979f2141d0dULL, 0x0000000000000000ULL,
+ 0x1ec696a15fb73e59ULL, 0xd86b110b16784e2eULL,
+ 0x8e7f8858b0e74a6dULL, 0x063e2e8713d05fe6ULL,
+ 0xe2c40ed3bbdb6d7aULL, 0xb1f1aeca89fc97acULL,
+ 0xe1db191e3cb3cc09ULL, 0x6418ee62c4eaf389ULL,
+ 0xc6ad87aa49cf7077ULL, 0xd6f65765ca7ec556ULL,
+ 0x9afb6c6dda3d9503ULL, 0x7ce05644888d9236ULL,
+ 0x8d609f95378feb1eULL, 0x23a9aa4e9c17d631ULL,
+ 0x6226c0e5d73aac6fULL, 0x56149953a69f0443ULL,
+ 0xeeb852c09d66d3abULL, 0x2b0ac2a753c102afULL,
+ 0x07c023376e03cb3cULL, 0x2ccae1903dc2c993ULL,
+ 0xd3d76e2f5ec63bc3ULL, 0x9e2458973356ff4cULL,
+ 0xa66a5d32644ee9b1ULL, 0x0a427294356de137ULL,
+ 0x783f62be61e6f879ULL, 0x1344c70204d91452ULL,
+ 0x5b96c8f0fdf12e48ULL, 0xa90916ecc59bf613ULL,
+ 0xbe92e5142829880eULL, 0x727d102a548b194eULL,
+ 0x1be7afebcb0fc0ccULL, 0x3e702b2244c8491bULL,
+ 0xd5e940a84d166425ULL, 0x66f9f41f3e51c620ULL,
+ 0xabe80c913f20c3baULL, 0xf07ec461c2d1edf2ULL,
+ 0xf361d3ac45b94c81ULL, 0x0521394a94b8fe95ULL,
+ 0xadd622162cf09c5cULL, 0xe97871f7f3651897ULL,
+ 0xf4a1f09b2bba87bdULL, 0x095d6559b2054044ULL,
+ 0x0bbc7f2448be75edULL, 0x2af4cf172e129675ULL,
+ 0x157ae98517094bb4ULL, 0x9fda55274e856b96ULL,
+ 0x914713499283e0eeULL, 0xb952c623462a4332ULL,
+ 0x74433ead475b46a8ULL, 0x8b5eb112245fb4f8ULL,
+ 0xa34b6478f0f61724ULL, 0x11a5dd7ffe6221fbULL,
+ 0xc16da49d27ccbb4bULL, 0x76a224d0bde07301ULL,
+ 0x8aa0bca2598c2022ULL, 0x4df336b86d90c48fULL,
+ 0xea67663a740db9e4ULL, 0xef465f70e0b54771ULL,
+ 0x39b008152acb8227ULL, 0x7d1e5bf4f55e06ecULL,
+ 0x105bd0cf83b1b521ULL, 0x775c2960c033e7dbULL,
+ 0x7e014c397236a79fULL, 0x811cc386113255cfULL,
+ 0xeda7450d1a0e72d8ULL, 0x5889df3d7a998f3bULL,
+ 0x2e2bfbedc779fc3aULL, 0xce0eef438619a4e9ULL,
+ 0x372d4e7bf6cd095fULL, 0x04df34fae96b6a4fULL,
+ 0xf923a13870d4adb6ULL, 0xa1aa7e050a4d228dULL,
+ 0xa8f71b5cb84862c9ULL, 0xb52e9a306097fde3ULL,
+ 0x0d8251a35b6e2a0bULL, 0x2257a7fee1c442ebULL,
+ 0x73831d9a29588d94ULL, 0x51d4ba64c89ccf7fULL,
+ 0x502ab7d4b54f5ba5ULL, 0x97793dce8153bf08ULL,
+ 0xe5042de4d5d8a646ULL, 0x9687307efc802bd2ULL,
+ 0xa05473b5779eb657ULL, 0xb4d097801d446939ULL,
+ 0xcff0e2f3fbca3033ULL, 0xc38cbee0dd778ee2ULL,
+ 0x464f499c252eb162ULL, 0xcad1dbb96f72cea6ULL,
+ 0xba4dd1eec142e241ULL, 0xb00fa37af42f0376ULL },
+ /* 2 */
+ { 0xcce4cd3aa968b245ULL, 0x089d5484e80b7fafULL,
+ 0x638246c1b3548304ULL, 0xd2fe0ec8c2355492ULL,
+ 0xa7fbdf7ff2374eeeULL, 0x4df1600c92337a16ULL,
+ 0x84e503ea523b12fbULL, 0x0790bbfd53ab0c4aULL,
+ 0x198a780f38f6ea9dULL, 0x2ab30c8f55ec48cbULL,
+ 0xe0f7fed6b2c49db5ULL, 0xb6ecf3f422cadbdcULL,
+ 0x409c9a541358df11ULL, 0xd3ce8a56dfde3fe3ULL,
+ 0xc3e9224312c8c1a0ULL, 0x0d6dfa58816ba507ULL,
+ 0xddf3e1b179952777ULL, 0x04c02a42748bb1d9ULL,
+ 0x94c2abff9f2decb8ULL, 0x4f91752da8f8acf4ULL,
+ 0x78682befb169bf7bULL, 0xe1c77a48af2ff6c4ULL,
+ 0x0c5d7ec69c80ce76ULL, 0x4cc1e4928fd81167ULL,
+ 0xfeed3d24d9997b62ULL, 0x518bb6dfc3a54a23ULL,
+ 0x6dbf2d26151f9b90ULL, 0xb5bc624b05ea664fULL,
+ 0xe86aaa525acfe21aULL, 0x4801ced0fb53a0beULL,
+ 0xc91463e6c00868edULL, 0x1027a815cd16fe43ULL,
+ 0xf67069a0319204cdULL, 0xb04ccc976c8abce7ULL,
+ 0xc0b9b3fc35e87c33ULL, 0xf380c77c58f2de65ULL,
+ 0x50bb3241de4e2152ULL, 0xdf93f490435ef195ULL,
+ 0xf1e0d25d62390887ULL, 0xaf668bfb1a3c3141ULL,
+ 0xbc11b251f00a7291ULL, 0x73a5eed47e427d47ULL,
+ 0x25bee3f6ee4c3b2eULL, 0x43cc0beb34786282ULL,
+ 0xc824e778dde3039cULL, 0xf97d86d98a327728ULL,
+ 0xf2b043e24519b514ULL, 0xe297ebf7880f4b57ULL,
+ 0x3a94a49a98fab688ULL, 0x868516cb68f0c419ULL,
+ 0xeffa11af0964ee50ULL, 0xa4ab4ec0d517f37dULL,
+ 0xa9c6b498547c567aULL, 0x8e18424f80fbbbb6ULL,
+ 0x0bcdc53bcf2bc23cULL, 0x137739aaea3643d0ULL,
+ 0x2c1333ec1bac2ff0ULL, 0x8d48d3f0a7db0625ULL,
+ 0x1e1ac3f26b5de6d7ULL, 0xf520f81f16b2b95eULL,
+ 0x9f0f6ec450062e84ULL, 0x0130849e1deb6b71ULL,
+ 0xd45e31ab8c7533a9ULL, 0x652279a2fd14e43fULL,
+ 0x3209f01e70f1c927ULL, 0xbe71a770cac1a473ULL,
+ 0x0e3d6be7a64b1894ULL, 0x7ec8148cff29d840ULL,
+ 0xcb7476c7fac3be0fULL, 0x72956a4a63a91636ULL,
+ 0x37f95ec21991138fULL, 0x9e3fea5a4ded45f5ULL,
+ 0x7b38ba50964902e8ULL, 0x222e580bbde73764ULL,
+ 0x61e253e0899f55e6ULL, 0xfc8d2805e352ad80ULL,
+ 0x35994be3235ac56dULL, 0x09add01af5e014deULL,
+ 0x5e8659a6780539c6ULL, 0xb17c48097161d796ULL,
+ 0x026015213acbd6e2ULL, 0xd1ae9f77e515e901ULL,
+ 0xb7dc776a3f21b0adULL, 0xaba6a1b96eb78098ULL,
+ 0x9bcf4486248d9f5dULL, 0x582666c536455efdULL,
+ 0xfdbdac9bfeb9c6f1ULL, 0xc47999be4163cdeaULL,
+ 0x765540081722a7efULL, 0x3e548ed8ec710751ULL,
+ 0x3d041f67cb51bac2ULL, 0x7958af71ac82d40aULL,
+ 0x36c9da5c047a78feULL, 0xed9a048e33af38b2ULL,
+ 0x26ee7249c96c86bdULL, 0x900281bdeba65d61ULL,
+ 0x11172c8bd0fd9532ULL, 0xea0abf73600434f8ULL,
+ 0x42fc8f75299309f3ULL, 0x34a9cf7d3eb1ae1cULL,
+ 0x2b838811480723baULL, 0x5ce64c8742ceef24ULL,
+ 0x1adae9b01fd6570eULL, 0x3c349bf9d6bad1b3ULL,
+ 0x82453c891c7b75c0ULL, 0x97923a40b80d512bULL,
+ 0x4a61dbf1c198765cULL, 0xb48ce6d518010d3eULL,
+ 0xcfb45c858e480fd6ULL, 0xd933cbf30d1e96aeULL,
+ 0xd70ea014ab558e3aULL, 0xc189376228031742ULL,
+ 0x9262949cd16d8b83ULL, 0xeb3a3bed7def5f89ULL,
+ 0x49314a4ee6b8cbcfULL, 0xdcc3652f647e4c06ULL,
+ 0xda635a4c2a3e2b3dULL, 0x470c21a940f3d35bULL,
+ 0x315961a157d174b4ULL, 0x6672e81dda3459acULL,
+ 0x5b76f77a1165e36eULL, 0x445cb01667d36ec8ULL,
+ 0xc5491d205c88a69bULL, 0x456c34887a3805b9ULL,
+ 0xffddb9bac4721013ULL, 0x99af51a71e4649bfULL,
+ 0xa15be01cbc7729d5ULL, 0x52db2760e485f7b0ULL,
+ 0x8c78576eba306d54ULL, 0xae560f6507d75a30ULL,
+ 0x95f22f6182c687c9ULL, 0x71c5fbf54489aba5ULL,
+ 0xca44f259e728d57eULL, 0x88b87d2ccebbdc8dULL,
+ 0xbab18d32be4a15aaULL, 0x8be8ec93e99b611eULL,
+ 0x17b713e89ebdf209ULL, 0xb31c5d284baa0174ULL,
+ 0xeeca9531148f8521ULL, 0xb8d198138481c348ULL,
+ 0x8988f9b2d350b7fcULL, 0xb9e11c8d996aa839ULL,
+ 0x5a4673e40c8e881fULL, 0x1687977683569978ULL,
+ 0xbf4123eed72acf02ULL, 0x4ea1f1b3b513c785ULL,
+ 0xe767452be16f91ffULL, 0x7505d1b730021a7cULL,
+ 0xa59bca5ec8fc980cULL, 0xad069eda20f7e7a3ULL,
+ 0x38f4b1bba231606aULL, 0x60d2d77e94743e97ULL,
+ 0x9affc0183966f42cULL, 0x248e6768f3a7505fULL,
+ 0xcdd449a4b483d934ULL, 0x87b59255751baf68ULL,
+ 0x1bea6d2e023d3c7fULL, 0x6b1f12455b5ffcabULL,
+ 0x743555292de9710dULL, 0xd8034f6d10f5fddfULL,
+ 0xc6198c9f7ba81b08ULL, 0xbb8109aca3a17edbULL,
+ 0xfa2d1766ad12cabbULL, 0xc729080166437079ULL,
+ 0x9c5fff7b77269317ULL, 0x0000000000000000ULL,
+ 0x15d706c9a47624ebULL, 0x6fdf38072fd44d72ULL,
+ 0x5fb6dd3865ee52b7ULL, 0xa33bf53d86bcff37ULL,
+ 0xe657c1b5fc84fa8eULL, 0xaa962527735cebe9ULL,
+ 0x39c43525bfda0b1bULL, 0x204e4d2a872ce186ULL,
+ 0x7a083ece8ba26999ULL, 0x554b9c9db72efbfaULL,
+ 0xb22cd9b656416a05ULL, 0x96a2bedea5e63a5aULL,
+ 0x802529a826b0a322ULL, 0x8115ad363b5bc853ULL,
+ 0x8375b81701901eb1ULL, 0x3069e53f4a3a1fc5ULL,
+ 0xbd2136cfede119e0ULL, 0x18bafc91251d81ecULL,
+ 0x1d4a524d4c7d5b44ULL, 0x05f0aedc6960daa8ULL,
+ 0x29e39d3072ccf558ULL, 0x70f57f6b5962c0d4ULL,
+ 0x989fd53903ad22ceULL, 0xf84d024797d91c59ULL,
+ 0x547b1803aac5908bULL, 0xf0d056c37fd263f6ULL,
+ 0xd56eb535919e58d8ULL, 0x1c7ad6d351963035ULL,
+ 0x2e7326cd2167f912ULL, 0xac361a443d1c8cd2ULL,
+ 0x697f076461942a49ULL, 0x4b515f6fdc731d2dULL,
+ 0x8ad8680df4700a6fULL, 0x41ac1eca0eb3b460ULL,
+ 0x7d988533d80965d3ULL, 0xa8f6300649973d0bULL,
+ 0x7765c4960ac9cc9eULL, 0x7ca801adc5e20ea2ULL,
+ 0xdea3700e5eb59ae4ULL, 0xa06b6482a19c42a4ULL,
+ 0x6a2f96db46b497daULL, 0x27def6d7d487edccULL,
+ 0x463ca5375d18b82aULL, 0xa6cb5be1efdc259fULL,
+ 0x53eba3fef96e9cc1ULL, 0xce84d81b93a364a7ULL,
+ 0xf4107c810b59d22fULL, 0x333974806d1aa256ULL,
+ 0x0f0def79bba073e5ULL, 0x231edc95a00c5c15ULL,
+ 0xe437d494c64f2c6cULL, 0x91320523f64d3610ULL,
+ 0x67426c83c7df32ddULL, 0x6eefbc99323f2603ULL,
+ 0x9d6f7be56acdf866ULL, 0x5916e25b2bae358cULL,
+ 0x7ff89012e2c2b331ULL, 0x035091bf2720bd93ULL,
+ 0x561b0d22900e4669ULL, 0x28d319ae6f279e29ULL,
+ 0x2f43a2533c8c9263ULL, 0xd09e1be9f8fe8270ULL,
+ 0xf740ed3e2c796fbcULL, 0xdb53ded237d5404cULL,
+ 0x62b2c25faebfe875ULL, 0x0afd41a5d2c0a94dULL,
+ 0x6412fd3ce0ff8f4eULL, 0xe3a76f6995e42026ULL,
+ 0x6c8fa9b808f4f0e1ULL, 0xc2d9a6dd0f23aad1ULL,
+ 0x8f28c6d19d10d0c7ULL, 0x85d587744fd0798aULL,
+ 0xa20b71a39b579446ULL, 0x684f83fa7c7f4138ULL,
+ 0xe507500adba4471dULL, 0x3f640a46f19a6c20ULL,
+ 0x1247bd34f7dd28a1ULL, 0x2d23b77206474481ULL,
+ 0x93521002cc86e0f2ULL, 0x572b89bc8de52d18ULL,
+ 0xfb1d93f8b0f9a1caULL, 0xe95a2ecc4724896bULL,
+ 0x3ba420048511ddf9ULL, 0xd63e248ab6bee54bULL,
+ 0x5dd6c8195f258455ULL, 0x06a03f634e40673bULL,
+ 0x1f2a476c76b68da6ULL, 0x217ec9b49ac78af7ULL,
+ 0xecaa80102e4453c3ULL, 0x14e78257b99d4f9aULL },
+ /* 3 */
+ { 0x20329b2cc87bba05ULL, 0x4f5eb6f86546a531ULL,
+ 0xd4f44775f751b6b1ULL, 0x8266a47b850dfa8bULL,
+ 0xbb986aa15a6ca985ULL, 0xc979eb08f9ae0f99ULL,
+ 0x2da6f447a2375ea1ULL, 0x1e74275dcd7d8576ULL,
+ 0xbc20180a800bc5f8ULL, 0xb4a2f701b2dc65beULL,
+ 0xe726946f981b6d66ULL, 0x48e6c453bf21c94cULL,
+ 0x42cad9930f0a4195ULL, 0xefa47b64aacccd20ULL,
+ 0x71180a8960409a42ULL, 0x8bb3329bf6a44e0cULL,
+ 0xd34c35de2d36daccULL, 0xa92f5b7cbc23dc96ULL,
+ 0xb31a85aa68bb09c3ULL, 0x13e04836a73161d2ULL,
+ 0xb24dfc4129c51d02ULL, 0x8ae44b70b7da5acdULL,
+ 0xe671ed84d96579a7ULL, 0xa4bb3417d66f3832ULL,
+ 0x4572ab38d56d2de8ULL, 0xb1b47761ea47215cULL,
+ 0xe81c09cf70aba15dULL, 0xffbdb872ce7f90acULL,
+ 0xa8782297fd5dc857ULL, 0x0d946f6b6a4ce4a4ULL,
+ 0xe4df1f4f5b995138ULL, 0x9ebc71edca8c5762ULL,
+ 0x0a2c1dc0b02b88d9ULL, 0x3b503c115d9d7b91ULL,
+ 0xc64376a8111ec3a2ULL, 0xcec199a323c963e4ULL,
+ 0xdc76a87ec58616f7ULL, 0x09d596e073a9b487ULL,
+ 0x14583a9d7d560dafULL, 0xf4c6dc593f2a0cb4ULL,
+ 0xdd21d19584f80236ULL, 0x4a4836983ddde1d3ULL,
+ 0xe58866a41ae745f9ULL, 0xf591a5b27e541875ULL,
+ 0x891dc05074586693ULL, 0x5b068c651810a89eULL,
+ 0xa30346bc0c08544fULL, 0x3dbf3751c684032dULL,
+ 0x2a1e86ec785032dcULL, 0xf73f5779fca830eaULL,
+ 0xb60c05ca30204d21ULL, 0x0cc316802b32f065ULL,
+ 0x8770241bdd96be69ULL, 0xb861e18199ee95dbULL,
+ 0xf805cad91418fcd1ULL, 0x29e70dccbbd20e82ULL,
+ 0xc7140f435060d763ULL, 0x0f3a9da0e8b0cc3bULL,
+ 0xa2543f574d76408eULL, 0xbd7761e1c175d139ULL,
+ 0x4b1f4f737ca3f512ULL, 0x6dc2df1f2fc137abULL,
+ 0xf1d05c3967b14856ULL, 0xa742bf3715ed046cULL,
+ 0x654030141d1697edULL, 0x07b872abda676c7dULL,
+ 0x3ce84eba87fa17ecULL, 0xc1fb0403cb79afdfULL,
+ 0x3e46bc7105063f73ULL, 0x278ae987121cd678ULL,
+ 0xa1adb4778ef47cd0ULL, 0x26dd906c5362c2b9ULL,
+ 0x05168060589b44e2ULL, 0xfbfc41f9d79ac08fULL,
+ 0x0e6de44ba9ced8faULL, 0x9feb08068bf243a3ULL,
+ 0x7b341749d06b129bULL, 0x229c69e74a87929aULL,
+ 0xe09ee6c4427c011bULL, 0x5692e30e725c4c3aULL,
+ 0xda99a33e5e9f6e4bULL, 0x353dd85af453a36bULL,
+ 0x25241b4c90e0fee7ULL, 0x5de987258309d022ULL,
+ 0xe230140fc0802984ULL, 0x93281e86a0c0b3c6ULL,
+ 0xf229d719a4337408ULL, 0x6f6c2dd4ad3d1f34ULL,
+ 0x8ea5b2fbae3f0aeeULL, 0x8331dd90c473ee4aULL,
+ 0x346aa1b1b52db7aaULL, 0xdf8f235e06042aa9ULL,
+ 0xcc6f6b68a1354b7bULL, 0x6c95a6f46ebf236aULL,
+ 0x52d31a856bb91c19ULL, 0x1a35ded6d498d555ULL,
+ 0xf37eaef2e54d60c9ULL, 0x72e181a9a3c2a61cULL,
+ 0x98537aad51952fdeULL, 0x16f6c856ffaa2530ULL,
+ 0xd960281e9d1d5215ULL, 0x3a0745fa1ce36f50ULL,
+ 0x0b7b642bf1559c18ULL, 0x59a87eae9aec8001ULL,
+ 0x5e100c05408bec7cULL, 0x0441f98b19e55023ULL,
+ 0xd70dcc5534d38aefULL, 0x927f676de1bea707ULL,
+ 0x9769e70db925e3e5ULL, 0x7a636ea29115065aULL,
+ 0x468b201816ef11b6ULL, 0xab81a9b73edff409ULL,
+ 0xc0ac7de88a07bb1eULL, 0x1f235eb68c0391b7ULL,
+ 0x6056b074458dd30fULL, 0xbe8eeac102f7ed67ULL,
+ 0xcd381283e04b5fbaULL, 0x5cbefecec277c4e3ULL,
+ 0xd21b4c356c48ce0dULL, 0x1019c31664b35d8cULL,
+ 0x247362a7d19eea26ULL, 0xebe582efb3299d03ULL,
+ 0x02aef2cb82fc289fULL, 0x86275df09ce8aaa8ULL,
+ 0x28b07427faac1a43ULL, 0x38a9b7319e1f47cfULL,
+ 0xc82e92e3b8d01b58ULL, 0x06ef0b409b1978bcULL,
+ 0x62f842bfc771fb90ULL, 0x9904034610eb3b1fULL,
+ 0xded85ab5477a3e68ULL, 0x90d195a663428f98ULL,
+ 0x5384636e2ac708d8ULL, 0xcbd719c37b522706ULL,
+ 0xae9729d76644b0ebULL, 0x7c8c65e20a0c7ee6ULL,
+ 0x80c856b007f1d214ULL, 0x8c0b40302cc32271ULL,
+ 0xdbcedad51fe17a8aULL, 0x740e8ae938dbdea0ULL,
+ 0xa615c6dc549310adULL, 0x19cc55f6171ae90bULL,
+ 0x49b1bdb8fe5fdd8dULL, 0xed0a89af2830e5bfULL,
+ 0x6a7aadb4f5a65bd6ULL, 0x7e22972988f05679ULL,
+ 0xf952b3325566e810ULL, 0x39fecedadf61530eULL,
+ 0x6101c99f04f3c7ceULL, 0x2e5f7f6761b562ffULL,
+ 0xf08725d226cf5c97ULL, 0x63af3b54860fef51ULL,
+ 0x8ff2cb10ef411e2fULL, 0x884ab9bb35267252ULL,
+ 0x4df04433e7ba8daeULL, 0x9afd8866d3690741ULL,
+ 0x66b9bb34de94abb3ULL, 0x9baaf18d92171380ULL,
+ 0x543c11c5f0a064a5ULL, 0x17a1b1bdbed431f1ULL,
+ 0xb5f58eeaf3a2717fULL, 0xc355f6c849858740ULL,
+ 0xec5df044694ef17eULL, 0xd83751f5dc6346d4ULL,
+ 0xfc4433520dfdacf2ULL, 0x0000000000000000ULL,
+ 0x5a51f58e596ebc5fULL, 0x3285aaf12e34cf16ULL,
+ 0x8d5c39db6dbd36b0ULL, 0x12b731dde64f7513ULL,
+ 0x94906c2d7aa7dfbbULL, 0x302b583aacc8e789ULL,
+ 0x9d45facd090e6b3cULL, 0x2165e2c78905aec4ULL,
+ 0x68d45f7f775a7349ULL, 0x189b2c1d5664fdcaULL,
+ 0xe1c99f2f030215daULL, 0x6983269436246788ULL,
+ 0x8489af3b1e148237ULL, 0xe94b702431d5b59cULL,
+ 0x33d2d31a6f4adbd7ULL, 0xbfd9932a4389f9a6ULL,
+ 0xb0e30e8aab39359dULL, 0xd1e2c715afcaf253ULL,
+ 0x150f43763c28196eULL, 0xc4ed846393e2eb3dULL,
+ 0x03f98b20c3823c5eULL, 0xfd134ab94c83b833ULL,
+ 0x556b682eb1de7064ULL, 0x36c4537a37d19f35ULL,
+ 0x7559f30279a5ca61ULL, 0x799ae58252973a04ULL,
+ 0x9c12832648707ffdULL, 0x78cd9c6913e92ec5ULL,
+ 0x1d8dac7d0effb928ULL, 0x439da0784e745554ULL,
+ 0x413352b3cc887dcbULL, 0xbacf134a1b12bd44ULL,
+ 0x114ebafd25cd494dULL, 0x2f08068c20cb763eULL,
+ 0x76a07822ba27f63fULL, 0xeab2fb04f25789c2ULL,
+ 0xe3676de481fe3d45ULL, 0x1b62a73d95e6c194ULL,
+ 0x641749ff5c68832cULL, 0xa5ec4dfc97112cf3ULL,
+ 0xf6682e92bdd6242bULL, 0x3f11c59a44782bb2ULL,
+ 0x317c21d1edb6f348ULL, 0xd65ab5be75ad9e2eULL,
+ 0x6b2dd45fb4d84f17ULL, 0xfaab381296e4d44eULL,
+ 0xd0b5befeeeb4e692ULL, 0x0882ef0b32d7a046ULL,
+ 0x512a91a5a83b2047ULL, 0x963e9ee6f85bf724ULL,
+ 0x4e09cf132438b1f0ULL, 0x77f701c9fb59e2feULL,
+ 0x7ddb1c094b726a27ULL, 0x5f4775ee01f5f8bdULL,
+ 0x9186ec4d223c9b59ULL, 0xfeeac1998f01846dULL,
+ 0xac39db1ce4b89874ULL, 0xb75b7c21715e59e0ULL,
+ 0xafc0503c273aa42aULL, 0x6e3b543fec430bf5ULL,
+ 0x704f7362213e8e83ULL, 0x58ff0745db9294c0ULL,
+ 0x67eec2df9feabf72ULL, 0xa0facd9ccf8a6811ULL,
+ 0xb936986ad890811aULL, 0x95c715c63bd9cb7aULL,
+ 0xca8060283a2c33c7ULL, 0x507de84ee9453486ULL,
+ 0x85ded6d05f6a96f6ULL, 0x1cdad5964f81ade9ULL,
+ 0xd5a33e9eb62fa270ULL, 0x40642b588df6690aULL,
+ 0x7f75eec2c98e42b8ULL, 0x2cf18dace3494a60ULL,
+ 0x23cb100c0bf9865bULL, 0xeef3028febb2d9e1ULL,
+ 0x4425d2d394133929ULL, 0xaad6d05c7fa1e0c8ULL,
+ 0xad6ea2f7a5c68cb5ULL, 0xc2028f2308fb9381ULL,
+ 0x819f2f5b468fc6d5ULL, 0xc5bafd88d29cfffcULL,
+ 0x47dc59f357910577ULL, 0x2b49ff07392e261dULL,
+ 0x57c59ae5332258fbULL, 0x73b6f842e2bcb2ddULL,
+ 0xcf96e04862b77725ULL, 0x4ca73dd8a6c4996fULL,
+ 0x015779eb417e14c1ULL, 0x37932a9176af8bf4ULL },
+ /* 4 */
+ { 0x190a2c9b249df23eULL, 0x2f62f8b62263e1e9ULL,
+ 0x7a7f754740993655ULL, 0x330b7ba4d5564d9fULL,
+ 0x4c17a16a46672582ULL, 0xb22f08eb7d05f5b8ULL,
+ 0x535f47f40bc148ccULL, 0x3aec5d27d4883037ULL,
+ 0x10ed0a1825438f96ULL, 0x516101f72c233d17ULL,
+ 0x13cc6f949fd04eaeULL, 0x739853c441474bfdULL,
+ 0x653793d90d3f5b1bULL, 0x5240647b96b0fc2fULL,
+ 0x0c84890ad27623e0ULL, 0xd7189b32703aaea3ULL,
+ 0x2685de3523bd9c41ULL, 0x99317c5b11bffefaULL,
+ 0x0d9baa854f079703ULL, 0x70b93648fbd48ac5ULL,
+ 0xa80441fce30bc6beULL, 0x7287704bdc36ff1eULL,
+ 0xb65384ed33dc1f13ULL, 0xd36417343ee34408ULL,
+ 0x39cd38ab6e1bf10fULL, 0x5ab861770a1f3564ULL,
+ 0x0ebacf09f594563bULL, 0xd04572b884708530ULL,
+ 0x3cae9722bdb3af47ULL, 0x4a556b6f2f5cbaf2ULL,
+ 0xe1704f1f76c4bd74ULL, 0x5ec4ed7144c6dfcfULL,
+ 0x16afc01d4c7810e6ULL, 0x283f113cd629ca7aULL,
+ 0xaf59a8761741ed2dULL, 0xeed5a3991e215facULL,
+ 0x3bf37ea849f984d4ULL, 0xe413e096a56ce33cULL,
+ 0x2c439d3a98f020d1ULL, 0x637559dc6404c46bULL,
+ 0x9e6c95d1e5f5d569ULL, 0x24bb9836045fe99aULL,
+ 0x44efa466dac8ecc9ULL, 0xc6eab2a5c80895d6ULL,
+ 0x803b50c035220cc4ULL, 0x0321658cba93c138ULL,
+ 0x8f9ebc465dc7ee1cULL, 0xd15a5137190131d3ULL,
+ 0x0fa5ec8668e5e2d8ULL, 0x91c979578d1037b1ULL,
+ 0x0642ca05693b9f70ULL, 0xefca80168350eb4fULL,
+ 0x38d21b24f36a45ecULL, 0xbeab81e1af73d658ULL,
+ 0x8cbfd9cae7542f24ULL, 0xfd19cc0d81f11102ULL,
+ 0x0ac6430fbb4dbc90ULL, 0x1d76a09d6a441895ULL,
+ 0x2a01573ff1cbbfa1ULL, 0xb572e161894fde2bULL,
+ 0x8124734fa853b827ULL, 0x614b1fdf43e6b1b0ULL,
+ 0x68ac395c4238cc18ULL, 0x21d837bfd7f7b7d2ULL,
+ 0x20c714304a860331ULL, 0x5cfaab726324aa14ULL,
+ 0x74c5ba4eb50d606eULL, 0xf3a3030474654739ULL,
+ 0x23e671bcf015c209ULL, 0x45f087e947b9582aULL,
+ 0xd8bd77b418df4c7bULL, 0xe06f6c90ebb50997ULL,
+ 0x0bd96080263c0873ULL, 0x7e03f9410e40dcfeULL,
+ 0xb8e94be4c6484928ULL, 0xfb5b0608e8ca8e72ULL,
+ 0x1a2b49179e0e3306ULL, 0x4e29e76961855059ULL,
+ 0x4f36c4e6fcf4e4baULL, 0x49740ee395cf7bcaULL,
+ 0xc2963ea386d17f7dULL, 0x90d65ad810618352ULL,
+ 0x12d34c1b02a1fa4dULL, 0xfa44258775bb3a91ULL,
+ 0x18150f14b9ec46ddULL, 0x1491861e6b9a653dULL,
+ 0x9a1019d7ab2c3fc2ULL, 0x3668d42d06fe13d7ULL,
+ 0xdcc1fbb25606a6d0ULL, 0x969490dd795a1c22ULL,
+ 0x3549b1a1bc6dd2efULL, 0xc94f5e23a0ed770eULL,
+ 0xb9f6686b5b39fdcbULL, 0xc4d4f4a6efeae00dULL,
+ 0xe732851a1fff2204ULL, 0x94aad6de5eb869f9ULL,
+ 0x3f8ff2ae07206e7fULL, 0xfe38a9813b62d03aULL,
+ 0xa7a1ad7a8bee2466ULL, 0x7b6056c8dde882b6ULL,
+ 0x302a1e286fc58ca7ULL, 0x8da0fa457a259bc7ULL,
+ 0xb3302b64e074415bULL, 0x5402ae7eff8b635fULL,
+ 0x08f8050c9cafc94bULL, 0xae468bf98a3059ceULL,
+ 0x88c355cca98dc58fULL, 0xb10e6d67c7963480ULL,
+ 0xbad70de7e1aa3cf3ULL, 0xbfb4a26e320262bbULL,
+ 0xcb711820870f02d5ULL, 0xce12b7a954a75c9dULL,
+ 0x563ce87dd8691684ULL, 0x9f73b65e7884618aULL,
+ 0x2b1e74b06cba0b42ULL, 0x47cec1ea605b2df1ULL,
+ 0x1c698312f735ac76ULL, 0x5fdbcefed9b76b2cULL,
+ 0x831a354c8fb1cdfcULL, 0x820516c312c0791fULL,
+ 0xb74ca762aeadabf0ULL, 0xfc06ef821c80a5e1ULL,
+ 0x5723cbf24518a267ULL, 0x9d4df05d5f661451ULL,
+ 0x588627742dfd40bfULL, 0xda8331b73f3d39a0ULL,
+ 0x17b0e392d109a405ULL, 0xf965400bcf28fba9ULL,
+ 0x7c3dbf4229a2a925ULL, 0x023e460327e275dbULL,
+ 0x6cd0b55a0ce126b3ULL, 0xe62da695828e96e7ULL,
+ 0x42ad6e63b3f373b9ULL, 0xe50cc319381d57dfULL,
+ 0xc5cbd729729b54eeULL, 0x46d1e265fd2a9912ULL,
+ 0x6428b056904eeff8ULL, 0x8be23040131e04b7ULL,
+ 0x6709d5da2add2ec0ULL, 0x075de98af44a2b93ULL,
+ 0x8447dcc67bfbe66fULL, 0x6616f655b7ac9a23ULL,
+ 0xd607b8bded4b1a40ULL, 0x0563af89d3a85e48ULL,
+ 0x3db1b4ad20c21ba4ULL, 0x11f22997b8323b75ULL,
+ 0x292032b34b587e99ULL, 0x7f1cdace9331681dULL,
+ 0x8e819fc9c0b65affULL, 0xa1e3677fe2d5bb16ULL,
+ 0xcd33d225ee349da5ULL, 0xd9a2543b85aef898ULL,
+ 0x795e10cbfa0af76dULL, 0x25a4bbb9992e5d79ULL,
+ 0x78413344677b438eULL, 0xf0826688cef68601ULL,
+ 0xd27b34bba392f0ebULL, 0x551d8df162fad7bcULL,
+ 0x1e57c511d0d7d9adULL, 0xdeffbdb171e4d30bULL,
+ 0xf4feea8e802f6caaULL, 0xa480c8f6317de55eULL,
+ 0xa0fc44f07fa40ff5ULL, 0x95b5f551c3c9dd1aULL,
+ 0x22f952336d6476eaULL, 0x0000000000000000ULL,
+ 0xa6be8ef5169f9085ULL, 0xcc2cf1aa73452946ULL,
+ 0x2e7ddb39bf12550aULL, 0xd526dd3157d8db78ULL,
+ 0x486b2d6c08becf29ULL, 0x9b0f3a58365d8b21ULL,
+ 0xac78cdfaadd22c15ULL, 0xbc95c7e28891a383ULL,
+ 0x6a927f5f65dab9c3ULL, 0xc3891d2c1ba0cb9eULL,
+ 0xeaa92f9f50f8b507ULL, 0xcf0d9426c9d6e87eULL,
+ 0xca6e3baf1a7eb636ULL, 0xab25247059980786ULL,
+ 0x69b31ad3df4978fbULL, 0xe2512a93cc577c4cULL,
+ 0xff278a0ea61364d9ULL, 0x71a615c766a53e26ULL,
+ 0x89dc764334fc716cULL, 0xf87a638452594f4aULL,
+ 0xf2bc208be914f3daULL, 0x8766b94ac1682757ULL,
+ 0xbbc82e687cdb8810ULL, 0x626a7a53f9757088ULL,
+ 0xa2c202f358467a2eULL, 0x4d0882e5db169161ULL,
+ 0x09e7268301de7da8ULL, 0xe897699c771ac0dcULL,
+ 0xc8507dac3d9cc3edULL, 0xc0a878a0a1330aa6ULL,
+ 0x978bb352e42ba8c1ULL, 0xe9884a13ea6b743fULL,
+ 0x279afdbabecc28a2ULL, 0x047c8c064ed9eaabULL,
+ 0x507e2278b15289f4ULL, 0x599904fbb08cf45cULL,
+ 0xbd8ae46d15e01760ULL, 0x31353da7f2b43844ULL,
+ 0x8558ff49e68a528cULL, 0x76fbfc4d92ef15b5ULL,
+ 0x3456922e211c660cULL, 0x86799ac55c1993b4ULL,
+ 0x3e90d1219a51da9cULL, 0x2d5cbeb505819432ULL,
+ 0x982e5fd48cce4a19ULL, 0xdb9c1238a24c8d43ULL,
+ 0xd439febecaa96f9bULL, 0x418c0bef0960b281ULL,
+ 0x158ea591f6ebd1deULL, 0x1f48e69e4da66d4eULL,
+ 0x8afd13cf8e6fb054ULL, 0xf5e1c9011d5ed849ULL,
+ 0xe34e091c5126c8afULL, 0xad67ee7530a398f6ULL,
+ 0x43b24dec2e82c75aULL, 0x75da99c1287cd48dULL,
+ 0x92e81cdb3783f689ULL, 0xa3dd217cc537cecdULL,
+ 0x60543c50de970553ULL, 0x93f73f54aaf2426aULL,
+ 0xa91b62737e7a725dULL, 0xf19d4507538732e2ULL,
+ 0x77e4dfc20f9ea156ULL, 0x7d229ccdb4d31dc6ULL,
+ 0x1b346a98037f87e5ULL, 0xedf4c615a4b29e94ULL,
+ 0x4093286094110662ULL, 0xb0114ee85ae78063ULL,
+ 0x6ff1d0d6b672e78bULL, 0x6dcf96d591909250ULL,
+ 0xdfe09e3eec9567e8ULL, 0x3214582b4827f97cULL,
+ 0xb46dc2ee143e6ac8ULL, 0xf6c0ac8da7cd1971ULL,
+ 0xebb60c10cd8901e4ULL, 0xf7df8f023abcad92ULL,
+ 0x9c52d3d2c217a0b2ULL, 0x6b8d5cd0f8ab0d20ULL,
+ 0x3777f7a29b8fa734ULL, 0x011f238f9d71b4e3ULL,
+ 0xc1b75b2f3c42be45ULL, 0x5de588fdfe551ef7ULL,
+ 0x6eeef3592b035368ULL, 0xaa3a07ffc4e9b365ULL,
+ 0xecebe59a39c32a77ULL, 0x5ba742f8976e8187ULL,
+ 0x4b4a48e0b22d0e11ULL, 0xddded83dcb771233ULL,
+ 0xa59feb79ac0c51bdULL, 0xc7f5912a55792135ULL },
+ /* 5 */
+ { 0x6d6ae04668a9b08aULL, 0x3ab3f04b0be8c743ULL,
+ 0xe51e166b54b3c908ULL, 0xbe90a9eb35c2f139ULL,
+ 0xb2c7066637f2bec1ULL, 0xaa6945613392202cULL,
+ 0x9a28c36f3b5201ebULL, 0xddce5a93ab536994ULL,
+ 0x0e34133ef6382827ULL, 0x52a02ba1ec55048bULL,
+ 0xa2f88f97c4b2a177ULL, 0x8640e513ca2251a5ULL,
+ 0xcdf1d36258137622ULL, 0xfe6cb708dedf8ddbULL,
+ 0x8a174a9ec8121e5dULL, 0x679896036b81560eULL,
+ 0x59ed033395795feeULL, 0x1dd778ab8b74edafULL,
+ 0xee533ef92d9f926dULL, 0x2a8c79baf8a8d8f5ULL,
+ 0x6bcf398e69b119f6ULL, 0xe20491742fafdd95ULL,
+ 0x276488e0809c2aecULL, 0xea955b82d88f5cceULL,
+ 0x7102c63a99d9e0c4ULL, 0xf9763017a5c39946ULL,
+ 0x429fa2501f151b3dULL, 0x4659c72bea05d59eULL,
+ 0x984b7fdccf5a6634ULL, 0xf742232953fbb161ULL,
+ 0x3041860e08c021c7ULL, 0x747bfd9616cd9386ULL,
+ 0x4bb1367192312787ULL, 0x1b72a1638a6c44d3ULL,
+ 0x4a0e68a6e8359a66ULL, 0x169a5039f258b6caULL,
+ 0xb98a2ef44edee5a4ULL, 0xd9083fe85e43a737ULL,
+ 0x967f6ce239624e13ULL, 0x8874f62d3c1a7982ULL,
+ 0x3c1629830af06e3fULL, 0x9165ebfd427e5a8eULL,
+ 0xb5dd81794ceeaa5cULL, 0x0de8f15a7834f219ULL,
+ 0x70bd98ede3dd5d25ULL, 0xaccc9ca9328a8950ULL,
+ 0x56664eda1945ca28ULL, 0x221db34c0f8859aeULL,
+ 0x26dbd637fa98970dULL, 0x1acdffb4f068f932ULL,
+ 0x4585254f64090fa0ULL, 0x72de245e17d53afaULL,
+ 0x1546b25d7c546cf4ULL, 0x207e0ffffb803e71ULL,
+ 0xfaaad2732bcf4378ULL, 0xb462dfae36ea17bdULL,
+ 0xcf926fd1ac1b11fdULL, 0xe0672dc7dba7ba4aULL,
+ 0xd3fa49ad5d6b41b3ULL, 0x8ba81449b216a3bcULL,
+ 0x14f9ec8a0650d115ULL, 0x40fc1ee3eb1d7ce2ULL,
+ 0x23a2ed9b758ce44fULL, 0x782c521b14fddc7eULL,
+ 0x1c68267cf170504eULL, 0xbcf31558c1ca96e6ULL,
+ 0xa781b43b4ba6d235ULL, 0xf6fd7dfe29ff0c80ULL,
+ 0xb0a4bad5c3fad91eULL, 0xd199f51ea963266cULL,
+ 0x414340349119c103ULL, 0x5405f269ed4dadf7ULL,
+ 0xabd61bb649969dcdULL, 0x6813dbeae7bdc3c8ULL,
+ 0x65fb2ab09f8931d1ULL, 0xf1e7fae152e3181dULL,
+ 0xc1a67cef5a2339daULL, 0x7a4feea8e0f5bba1ULL,
+ 0x1e0b9acf05783791ULL, 0x5b8ebf8061713831ULL,
+ 0x80e53cdbcb3af8d9ULL, 0x7e898bd315e57502ULL,
+ 0xc6bcfbf0213f2d47ULL, 0x95a38e86b76e942dULL,
+ 0x092e94218d243cbaULL, 0x8339debf453622e7ULL,
+ 0xb11be402b9fe64ffULL, 0x57d9100d634177c9ULL,
+ 0xcc4e8db52217cbc3ULL, 0x3b0cae9c71ec7aa2ULL,
+ 0xfb158ca451cbfe99ULL, 0x2b33276d82ac6514ULL,
+ 0x01bf5ed77a04bde1ULL, 0xc5601994af33f779ULL,
+ 0x75c4a3416cc92e67ULL, 0xf3844652a6eb7fc2ULL,
+ 0x3487e375fdd0ef64ULL, 0x18ae430704609eedULL,
+ 0x4d14efb993298efbULL, 0x815a620cb13e4538ULL,
+ 0x125c354207487869ULL, 0x9eeea614ce42cf48ULL,
+ 0xce2d3106d61fac1cULL, 0xbbe99247bad6827bULL,
+ 0x071a871f7b1c149dULL, 0x2e4a1cc10db81656ULL,
+ 0x77a71ff298c149b8ULL, 0x06a5d9c80118a97cULL,
+ 0xad73c27e488e34b1ULL, 0x443a7b981e0db241ULL,
+ 0xe3bbcfa355ab6074ULL, 0x0af276450328e684ULL,
+ 0x73617a896dd1871bULL, 0x58525de4ef7de20fULL,
+ 0xb7be3dcab8e6cd83ULL, 0x19111dd07e64230cULL,
+ 0x842359a03e2a367aULL, 0x103f89f1f3401fb6ULL,
+ 0xdc710444d157d475ULL, 0xb835702334da5845ULL,
+ 0x4320fc876511a6dcULL, 0xd026abc9d3679b8dULL,
+ 0x17250eee885c0b2bULL, 0x90dab52a387ae76fULL,
+ 0x31fed8d972c49c26ULL, 0x89cba8fa461ec463ULL,
+ 0x2ff5421677bcabb7ULL, 0x396f122f85e41d7dULL,
+ 0xa09b332430bac6a8ULL, 0xc888e8ced7070560ULL,
+ 0xaeaf201ac682ee8fULL, 0x1180d7268944a257ULL,
+ 0xf058a43628e7a5fcULL, 0xbd4c4b8fbbce2b07ULL,
+ 0xa1246df34abe7b49ULL, 0x7d5569b79be9af3cULL,
+ 0xa9b5a705bd9efa12ULL, 0xdb6b835baa4bc0e8ULL,
+ 0x05793bac8f147342ULL, 0x21c1512881848390ULL,
+ 0xfdb0556c50d357e5ULL, 0x613d4fcb6a99ff72ULL,
+ 0x03dce2648e0cda3eULL, 0xe949b9e6568386f0ULL,
+ 0xfc0f0bbb2ad7ea04ULL, 0x6a70675913b5a417ULL,
+ 0x7f36d5046fe1c8e3ULL, 0x0c57af8d02304ff8ULL,
+ 0x32223abdfcc84618ULL, 0x0891caf6f720815bULL,
+ 0xa63eeaec31a26fd4ULL, 0x2507345374944d33ULL,
+ 0x49d28ac266394058ULL, 0xf5219f9aa7f3d6beULL,
+ 0x2d96fea583b4cc68ULL, 0x5a31e1571b7585d0ULL,
+ 0x8ed12fe53d02d0feULL, 0xdfade6205f5b0e4bULL,
+ 0x4cabb16ee92d331aULL, 0x04c6657bf510cea3ULL,
+ 0xd73c2cd6a87b8f10ULL, 0xe1d87310a1a307abULL,
+ 0x6cd5be9112ad0d6bULL, 0x97c032354366f3f2ULL,
+ 0xd4e0ceb22677552eULL, 0x0000000000000000ULL,
+ 0x29509bde76a402cbULL, 0xc27a9e8bd42fe3e4ULL,
+ 0x5ef7842cee654b73ULL, 0xaf107ecdbc86536eULL,
+ 0x3fcacbe784fcb401ULL, 0xd55f90655c73e8cfULL,
+ 0xe6c2f40fdabf1336ULL, 0xe8f6e7312c873b11ULL,
+ 0xeb2a0555a28be12fULL, 0xe4a148bc2eb774e9ULL,
+ 0x9b979db84156bc0aULL, 0x6eb60222e6a56ab4ULL,
+ 0x87ffbbc4b026ec44ULL, 0xc703a5275b3b90a6ULL,
+ 0x47e699fc9001687fULL, 0x9c8d1aa73a4aa897ULL,
+ 0x7cea3760e1ed12ddULL, 0x4ec80ddd1d2554c5ULL,
+ 0x13e36b957d4cc588ULL, 0x5d2b66486069914dULL,
+ 0x92b90999cc7280b0ULL, 0x517cc9c56259deb5ULL,
+ 0xc937b619ad03b881ULL, 0xec30824ad997f5b2ULL,
+ 0xa45d565fc5aa080bULL, 0xd6837201d27f32f1ULL,
+ 0x635ef3789e9198adULL, 0x531f75769651b96aULL,
+ 0x4f77530a6721e924ULL, 0x486dd4151c3dfdb9ULL,
+ 0x5f48dafb9461f692ULL, 0x375b011173dc355aULL,
+ 0x3da9775470f4d3deULL, 0x8d0dcd81b30e0ac0ULL,
+ 0x36e45fc609d888bbULL, 0x55baacbe97491016ULL,
+ 0x8cb29356c90ab721ULL, 0x76184125e2c5f459ULL,
+ 0x99f4210bb55edbd5ULL, 0x6f095cf59ca1d755ULL,
+ 0x9f51f8c3b44672a9ULL, 0x3538bda287d45285ULL,
+ 0x50c39712185d6354ULL, 0xf23b1885dcefc223ULL,
+ 0x79930ccc6ef9619fULL, 0xed8fdc9da3934853ULL,
+ 0xcb540aaa590bdf5eULL, 0x5c94389f1a6d2cacULL,
+ 0xe77daad8a0bbaed7ULL, 0x28efc5090ca0bf2aULL,
+ 0xbf2ff73c4fc64cd8ULL, 0xb37858b14df60320ULL,
+ 0xf8c96ec0dfc724a7ULL, 0x828680683f329f06ULL,
+ 0x941cd051cd6a29ccULL, 0xc3c5c05cae2b5e05ULL,
+ 0xb601631dc2e27062ULL, 0xc01922382027843bULL,
+ 0x24b86a840e90f0d2ULL, 0xd245177a276ffc52ULL,
+ 0x0f8b4de98c3c95c6ULL, 0x3e759530fef809e0ULL,
+ 0x0b4d2892792c5b65ULL, 0xc4df4743d5374a98ULL,
+ 0xa5e20888bfaeb5eaULL, 0xba56cc90c0d23f9aULL,
+ 0x38d04cf8ffe0a09cULL, 0x62e1adafe495254cULL,
+ 0x0263bcb3f40867dfULL, 0xcaeb547d230f62bfULL,
+ 0x6082111c109d4293ULL, 0xdad4dd8cd04f7d09ULL,
+ 0xefec602e579b2f8cULL, 0x1fb4c4187f7c8a70ULL,
+ 0xffd3e9dfa4db303aULL, 0x7bf0b07f9af10640ULL,
+ 0xf49ec14dddf76b5fULL, 0x8f6e713247066d1fULL,
+ 0x339d646a86ccfbf9ULL, 0x64447467e58d8c30ULL,
+ 0x2c29a072f9b07189ULL, 0xd8b7613f24471ad6ULL,
+ 0x6627c8d41185ebefULL, 0xa347d140beb61c96ULL,
+ 0xde12b8f7255fb3aaULL, 0x9d324470404e1576ULL,
+ 0x9306574eb6763d51ULL, 0xa80af9d2c79a47f3ULL,
+ 0x859c0777442e8b9bULL, 0x69ac853d9db97e29ULL },
+ /* 6 */
+ { 0xc3407dfc2de6377eULL, 0x5b9e93eea4256f77ULL,
+ 0xadb58fdd50c845e0ULL, 0x5219ff11a75bed86ULL,
+ 0x356b61cfd90b1de9ULL, 0xfb8f406e25abe037ULL,
+ 0x7a5a0231c0f60796ULL, 0x9d3cd216e1f5020bULL,
+ 0x0c6550fb6b48d8f3ULL, 0xf57508c427ff1c62ULL,
+ 0x4ad35ffa71cb407dULL, 0x6290a2da1666aa6dULL,
+ 0xe284ec2349355f9fULL, 0xb3c307c53d7c84ecULL,
+ 0x05e23c0468365a02ULL, 0x190bac4d6c9ebfa8ULL,
+ 0x94bbbee9e28b80faULL, 0xa34fc777529cb9b5ULL,
+ 0xcc7b39f095bcd978ULL, 0x2426addb0ce532e3ULL,
+ 0x7e79329312ce4fc7ULL, 0xab09a72eebec2917ULL,
+ 0xf8d15499f6b9d6c2ULL, 0x1a55b8babf8c895dULL,
+ 0xdb8add17fb769a85ULL, 0xb57f2f368658e81bULL,
+ 0x8acd36f18f3f41f6ULL, 0x5ce3b7bba50f11d3ULL,
+ 0x114dcc14d5ee2f0aULL, 0xb91a7fcded1030e8ULL,
+ 0x81d5425fe55de7a1ULL, 0xb6213bc1554adeeeULL,
+ 0x80144ef95f53f5f2ULL, 0x1e7688186db4c10cULL,
+ 0x3b912965db5fe1bcULL, 0xc281715a97e8252dULL,
+ 0x54a5d7e21c7f8171ULL, 0x4b12535ccbc5522eULL,
+ 0x1d289cefbea6f7f9ULL, 0x6ef5f2217d2e729eULL,
+ 0xe6a7dc819b0d17ceULL, 0x1b94b41c05829b0eULL,
+ 0x33d7493c622f711eULL, 0xdcf7f942fa5ce421ULL,
+ 0x600fba8b7f7a8ecbULL, 0x46b60f011a83988eULL,
+ 0x235b898e0dcf4c47ULL, 0x957ab24f588592a9ULL,
+ 0x4354330572b5c28cULL, 0xa5f3ef84e9b8d542ULL,
+ 0x8c711e02341b2d01ULL, 0x0b1874ae6a62a657ULL,
+ 0x1213d8e306fc19ffULL, 0xfe6d7c6a4d9dba35ULL,
+ 0x65ed868f174cd4c9ULL, 0x88522ea0e6236550ULL,
+ 0x899322065c2d7703ULL, 0xc01e690bfef4018bULL,
+ 0x915982ed8abddaf8ULL, 0xbe675b98ec3a4e4cULL,
+ 0xa996bf7f82f00db1ULL, 0xe1daf8d49a27696aULL,
+ 0x2effd5d3dc8986e7ULL, 0xd153a51f2b1a2e81ULL,
+ 0x18caa0ebd690adfbULL, 0x390e3134b243c51aULL,
+ 0x2778b92cdff70416ULL, 0x029f1851691c24a6ULL,
+ 0x5e7cafeacc133575ULL, 0xfa4e4cc89fa5f264ULL,
+ 0x5a5f9f481e2b7d24ULL, 0x484c47ab18d764dbULL,
+ 0x400a27f2a1a7f479ULL, 0xaeeb9b2a83da7315ULL,
+ 0x721c626879869734ULL, 0x042330a2d2384851ULL,
+ 0x85f672fd3765aff0ULL, 0xba446b3a3e02061dULL,
+ 0x73dd6ecec3888567ULL, 0xffac70ccf793a866ULL,
+ 0xdfa9edb5294ed2d4ULL, 0x6c6aea7014325638ULL,
+ 0x834a5a0e8c41c307ULL, 0xcdba35562fb2cb2bULL,
+ 0x0ad97808d06cb404ULL, 0x0f3b440cb85aee06ULL,
+ 0xe5f9c876481f213bULL, 0x98deee1289c35809ULL,
+ 0x59018bbfcd394bd1ULL, 0xe01bf47220297b39ULL,
+ 0xde68e1139340c087ULL, 0x9fa3ca4788e926adULL,
+ 0xbb85679c840c144eULL, 0x53d8f3b71d55ffd5ULL,
+ 0x0da45c5dd146caa0ULL, 0x6f34fe87c72060cdULL,
+ 0x57fbc315cf6db784ULL, 0xcee421a1fca0fddeULL,
+ 0x3d2d0196607b8d4bULL, 0x642c8a29ad42c69aULL,
+ 0x14aff010bdd87508ULL, 0xac74837beac657b3ULL,
+ 0x3216459ad821634dULL, 0x3fb219c70967a9edULL,
+ 0x06bc28f3bb246cf7ULL, 0xf2082c9126d562c6ULL,
+ 0x66b39278c45ee23cULL, 0xbd394f6f3f2878b9ULL,
+ 0xfd33689d9e8f8cc0ULL, 0x37f4799eb017394fULL,
+ 0x108cc0b26fe03d59ULL, 0xda4bd1b1417888d6ULL,
+ 0xb09d1332ee6eb219ULL, 0x2f3ed975668794b4ULL,
+ 0x58c0871977375982ULL, 0x7561463d78ace990ULL,
+ 0x09876cff037e82f1ULL, 0x7fb83e35a8c05d94ULL,
+ 0x26b9b58a65f91645ULL, 0xef20b07e9873953fULL,
+ 0x3148516d0b3355b8ULL, 0x41cb2b541ba9e62aULL,
+ 0x790416c613e43163ULL, 0xa011d380818e8f40ULL,
+ 0x3a5025c36151f3efULL, 0xd57095bdf92266d0ULL,
+ 0x498d4b0da2d97688ULL, 0x8b0c3a57353153a5ULL,
+ 0x21c491df64d368e1ULL, 0x8f2f0af5e7091bf4ULL,
+ 0x2da1c1240f9bb012ULL, 0xc43d59a92ccc49daULL,
+ 0xbfa6573e56345c1fULL, 0x828b56a8364fd154ULL,
+ 0x9a41f643e0df7cafULL, 0xbcf843c985266aeaULL,
+ 0x2b1de9d7b4bfdce5ULL, 0x20059d79dedd7ab2ULL,
+ 0x6dabe6d6ae3c446bULL, 0x45e81bf6c991ae7bULL,
+ 0x6351ae7cac68b83eULL, 0xa432e32253b6c711ULL,
+ 0xd092a9b991143cd2ULL, 0xcac711032e98b58fULL,
+ 0xd8d4c9e02864ac70ULL, 0xc5fc550f96c25b89ULL,
+ 0xd7ef8dec903e4276ULL, 0x67729ede7e50f06fULL,
+ 0xeac28c7af045cf3dULL, 0xb15c1f945460a04aULL,
+ 0x9cfddeb05bfb1058ULL, 0x93c69abce3a1fe5eULL,
+ 0xeb0380dc4a4bdd6eULL, 0xd20db1e8f8081874ULL,
+ 0x229a8528b7c15e14ULL, 0x44291750739fbc28ULL,
+ 0xd3ccbd4e42060a27ULL, 0xf62b1c33f4ed2a97ULL,
+ 0x86a8660ae4779905ULL, 0xd62e814a2a305025ULL,
+ 0x477703a7a08d8addULL, 0x7b9b0e977af815c5ULL,
+ 0x78c51a60a9ea2330ULL, 0xa6adfb733aaae3b7ULL,
+ 0x97e5aa1e3199b60fULL, 0x0000000000000000ULL,
+ 0xf4b404629df10e31ULL, 0x5564db44a6719322ULL,
+ 0x9207961a59afec0dULL, 0x9624a6b88b97a45cULL,
+ 0x363575380a192b1cULL, 0x2c60cd82b595a241ULL,
+ 0x7d272664c1dc7932ULL, 0x7142769faa94a1c1ULL,
+ 0xa1d0df263b809d13ULL, 0x1630e841d4c451aeULL,
+ 0xc1df65ad44fa13d8ULL, 0x13d2d445bcf20bacULL,
+ 0xd915c546926abe23ULL, 0x38cf3d92084dd749ULL,
+ 0xe766d0272103059dULL, 0xc7634d5effde7f2fULL,
+ 0x077d2455012a7ea4ULL, 0xedbfa82ff16fb199ULL,
+ 0xaf2a978c39d46146ULL, 0x42953fa3c8bbd0dfULL,
+ 0xcb061da59496a7dcULL, 0x25e7a17db6eb20b0ULL,
+ 0x34aa6d6963050fbaULL, 0xa76cf7d580a4f1e4ULL,
+ 0xf7ea10954ee338c4ULL, 0xfcf2643b24819e93ULL,
+ 0xcf252d0746aeef8dULL, 0x4ef06f58a3f3082cULL,
+ 0x563acfb37563a5d7ULL, 0x5086e740ce47c920ULL,
+ 0x2982f186dda3f843ULL, 0x87696aac5e798b56ULL,
+ 0x5d22bb1d1f010380ULL, 0x035e14f7d31236f5ULL,
+ 0x3cec0d30da759f18ULL, 0xf3c920379cdb7095ULL,
+ 0xb8db736b571e22bbULL, 0xdd36f5e44052f672ULL,
+ 0xaac8ab8851e23b44ULL, 0xa857b3d938fe1fe2ULL,
+ 0x17f1e4e76eca43fdULL, 0xec7ea4894b61a3caULL,
+ 0x9e62c6e132e734feULL, 0xd4b1991b432c7483ULL,
+ 0x6ad6c283af163acfULL, 0x1ce9904904a8e5aaULL,
+ 0x5fbda34c761d2726ULL, 0xf910583f4cb7c491ULL,
+ 0xc6a241f845d06d7cULL, 0x4f3163fe19fd1a7fULL,
+ 0xe99c988d2357f9c8ULL, 0x8eee06535d0709a7ULL,
+ 0x0efa48aa0254fc55ULL, 0xb4be23903c56fa48ULL,
+ 0x763f52caabbedf65ULL, 0xeee1bcd8227d876cULL,
+ 0xe345e085f33b4dccULL, 0x3e731561b369bbbeULL,
+ 0x2843fd2067adea10ULL, 0x2adce5710eb1ceb6ULL,
+ 0xb7e03767ef44ccbdULL, 0x8db012a48e153f52ULL,
+ 0x61ceb62dc5749c98ULL, 0xe85d942b9959eb9bULL,
+ 0x4c6f7709caef2c8aULL, 0x84377e5b8d6bbda3ULL,
+ 0x30895dcbb13d47ebULL, 0x74a04a9bc2a2fbc3ULL,
+ 0x6b17ce251518289cULL, 0xe438c4d0f2113368ULL,
+ 0x1fb784bed7bad35fULL, 0x9b80fae55ad16efcULL,
+ 0x77fe5e6c11b0cd36ULL, 0xc858095247849129ULL,
+ 0x08466059b97090a2ULL, 0x01c10ca6ba0e1253ULL,
+ 0x6988d6747c040c3aULL, 0x6849dad2c60a1e69ULL,
+ 0x5147ebe67449db73ULL, 0xc99905f4fd8a837aULL,
+ 0x991fe2b433cd4a5aULL, 0xf09734c04fc94660ULL,
+ 0xa28ecbd1e892abe6ULL, 0xf1563866f5c75433ULL,
+ 0x4dae7baf70e13ed9ULL, 0x7ce62ac27bd26b61ULL,
+ 0x70837a39109ab392ULL, 0x90988e4b30b3c8abULL,
+ 0xb2020b63877296bfULL, 0x156efcb607d6675bULL },
+ /* 7 */
+ { 0xe63f55ce97c331d0ULL, 0x25b506b0015bba16ULL,
+ 0xc8706e29e6ad9ba8ULL, 0x5b43d3775d521f6aULL,
+ 0x0bfa3d577035106eULL, 0xab95fc172afb0e66ULL,
+ 0xf64b63979e7a3276ULL, 0xf58b4562649dad4bULL,
+ 0x48f7c3dbae0c83f1ULL, 0xff31916642f5c8c5ULL,
+ 0xcbb048dc1c4a0495ULL, 0x66b8f83cdf622989ULL,
+ 0x35c130e908e2b9b0ULL, 0x7c761a61f0b34fa1ULL,
+ 0x3601161cf205268dULL, 0x9e54ccfe2219b7d6ULL,
+ 0x8b7d90a538940837ULL, 0x9cd403588ea35d0bULL,
+ 0xbc3c6fea9ccc5b5aULL, 0xe5ff733b6d24aeedULL,
+ 0xceed22de0f7eb8d2ULL, 0xec8581cab1ab545eULL,
+ 0xb96105e88ff8e71dULL, 0x8ca03501871a5eadULL,
+ 0x76ccce65d6db2a2fULL, 0x5883f582a7b58057ULL,
+ 0x3f7be4ed2e8adc3eULL, 0x0fe7be06355cd9c9ULL,
+ 0xee054e6c1d11be83ULL, 0x1074365909b903a6ULL,
+ 0x5dde9f80b4813c10ULL, 0x4a770c7d02b6692cULL,
+ 0x5379c8d5d7809039ULL, 0xb4067448161ed409ULL,
+ 0x5f5e5026183bd6cdULL, 0xe898029bf4c29df9ULL,
+ 0x7fb63c940a54d09cULL, 0xc5171f897f4ba8bcULL,
+ 0xa6f28db7b31d3d72ULL, 0x2e4f3be7716eaa78ULL,
+ 0x0d6771a099e63314ULL, 0x82076254e41bf284ULL,
+ 0x2f0fd2b42733df98ULL, 0x5c9e76d3e2dc49f0ULL,
+ 0x7aeb569619606cdbULL, 0x83478b07b2468764ULL,
+ 0xcfadcb8d5923cd32ULL, 0x85dac7f05b95a41eULL,
+ 0xb5469d1b4043a1e9ULL, 0xb821ecbbd9a592fdULL,
+ 0x1b8e0b0e798c13c8ULL, 0x62a57b6d9a0be02eULL,
+ 0xfcf1b793b81257f8ULL, 0x9d94ea0bd8fe28ebULL,
+ 0x4cea408aeb654a56ULL, 0x23284a47e888996cULL,
+ 0x2d8f1d128b893545ULL, 0xf4cbac3132c0d8abULL,
+ 0xbd7c86b9ca912ebaULL, 0x3a268eef3dbe6079ULL,
+ 0xf0d62f6077a9110cULL, 0x2735c916ade150cbULL,
+ 0x89fd5f03942ee2eaULL, 0x1acee25d2fd16628ULL,
+ 0x90f39bab41181bffULL, 0x430dfe8cde39939fULL,
+ 0xf70b8ac4c8274796ULL, 0x1c53aeaac6024552ULL,
+ 0x13b410acf35e9c9bULL, 0xa532ab4249faa24fULL,
+ 0x2b1251e5625a163fULL, 0xd7e3e676da4841c7ULL,
+ 0xa7b264e4e5404892ULL, 0xda8497d643ae72d3ULL,
+ 0x861ae105a1723b23ULL, 0x38a6414991048aa4ULL,
+ 0x6578dec92585b6b4ULL, 0x0280cfa6acbaeaddULL,
+ 0x88bdb650c273970aULL, 0x9333bd5ebbff84c2ULL,
+ 0x4e6a8f2c47dfa08bULL, 0x321c954db76cef2aULL,
+ 0x418d312a72837942ULL, 0xb29b38bfffcdf773ULL,
+ 0x6c022c38f90a4c07ULL, 0x5a033a240b0f6a8aULL,
+ 0x1f93885f3ce5da6fULL, 0xc38a537e96988bc6ULL,
+ 0x39e6a81ac759ff44ULL, 0x29929e43cee0fce2ULL,
+ 0x40cdd87924de0ca2ULL, 0xe9d8ebc8a29fe819ULL,
+ 0x0c2798f3cfbb46f4ULL, 0x55e484223e53b343ULL,
+ 0x4650948ecd0d2fd8ULL, 0x20e86cb2126f0651ULL,
+ 0x6d42c56baf5739e7ULL, 0xa06fc1405ace1e08ULL,
+ 0x7babbfc54f3d193bULL, 0x424d17df8864e67fULL,
+ 0xd8045870ef14980eULL, 0xc6d7397c85ac3781ULL,
+ 0x21a885e1443273b1ULL, 0x67f8116f893f5c69ULL,
+ 0x24f5efe35706cff6ULL, 0xd56329d076f2ab1aULL,
+ 0x5e1eb9754e66a32dULL, 0x28d2771098bd8902ULL,
+ 0x8f6013f47dfdc190ULL, 0x17a993fdb637553cULL,
+ 0xe0a219397e1012aaULL, 0x786b9930b5da8606ULL,
+ 0x6e82e39e55b0a6daULL, 0x875a0856f72f4ec3ULL,
+ 0x3741ff4fa458536dULL, 0xac4859b3957558fcULL,
+ 0x7ef6d5c75c09a57cULL, 0xc04a758b6c7f14fbULL,
+ 0xf9acdd91ab26ebbfULL, 0x7391a467c5ef9668ULL,
+ 0x335c7c1ee1319acaULL, 0xa91533b18641e4bbULL,
+ 0xe4bf9a683b79db0dULL, 0x8e20faa72ba0b470ULL,
+ 0x51f907737b3a7ae4ULL, 0x2268a314bed5ec8cULL,
+ 0xd944b123b949edeeULL, 0x31dcb3b84d8b7017ULL,
+ 0xd3fe65279f218860ULL, 0x097af2f1dc8ffab3ULL,
+ 0x9b09a6fc312d0b91ULL, 0xcc6ded78a3c4520fULL,
+ 0x3481d9ba5ebfcc50ULL, 0x4f2a667f1182d56bULL,
+ 0xdfd9fdd4509ace94ULL, 0x26752045fbbc252bULL,
+ 0xbffc491f662bc467ULL, 0xdd593272fc202449ULL,
+ 0x3cbbc218d46d4303ULL, 0x91b372f817456e1fULL,
+ 0x681faf69bc6385a0ULL, 0xb686bbeebaa43ed4ULL,
+ 0x1469b5084cd0ca01ULL, 0x98c98009cbca94acULL,
+ 0x6438379a73d8c354ULL, 0xc2caba2dc0c5fe26ULL,
+ 0x3e3b0dbe78d7a9deULL, 0x50b9ee202d670f04ULL,
+ 0x4590b27b37eab0e5ULL, 0x6025b4cb36b10af3ULL,
+ 0xfb2c1237079c0162ULL, 0xa12f28130c936be8ULL,
+ 0x4b37e52e54eb1cccULL, 0x083a1ba28ad28f53ULL,
+ 0xc10a9cd83a22611bULL, 0x9f1425ad7444c236ULL,
+ 0x069d4cf7e9d3237aULL, 0xedc56899e7f621beULL,
+ 0x778c273680865fcfULL, 0x309c5aeb1bd605f7ULL,
+ 0x8de0dc52d1472b4dULL, 0xf8ec34c2fd7b9e5fULL,
+ 0xea18cd3d58787724ULL, 0xaad515447ca67b86ULL,
+ 0x9989695a9d97e14cULL, 0x0000000000000000ULL,
+ 0xf196c63321f464ecULL, 0x71116bc169557cb5ULL,
+ 0xaf887f466f92c7c1ULL, 0x972e3e0ffe964d65ULL,
+ 0x190ec4a8d536f915ULL, 0x95aef1a9522ca7b8ULL,
+ 0xdc19db21aa7d51a9ULL, 0x94ee18fa0471d258ULL,
+ 0x8087adf248a11859ULL, 0xc457f6da2916dd5cULL,
+ 0xfa6cfb6451c17482ULL, 0xf256e0c6db13fbd1ULL,
+ 0x6a9f60cf10d96f7dULL, 0x4daaa9d9bd383fb6ULL,
+ 0x03c026f5fae79f3dULL, 0xde99148706c7bb74ULL,
+ 0x2a52b8b6340763dfULL, 0x6fc20acd03edd33aULL,
+ 0xd423c08320afdefaULL, 0xbbe1ca4e23420dc0ULL,
+ 0x966ed75ca8cb3885ULL, 0xeb58246e0e2502c4ULL,
+ 0x055d6a021334bc47ULL, 0xa47242111fa7d7afULL,
+ 0xe3623fcc84f78d97ULL, 0x81c744a11efc6db9ULL,
+ 0xaec8961539cfb221ULL, 0xf31609958d4e8e31ULL,
+ 0x63e5923ecc5695ceULL, 0x47107ddd9b505a38ULL,
+ 0xa3afe7b5a0298135ULL, 0x792b7063e387f3e6ULL,
+ 0x0140e953565d75e0ULL, 0x12f4f9ffa503e97bULL,
+ 0x750ce8902c3cb512ULL, 0xdbc47e8515f30733ULL,
+ 0x1ed3610c6ab8af8fULL, 0x5239218681dde5d9ULL,
+ 0xe222d69fd2aaf877ULL, 0xfe71783514a8bd25ULL,
+ 0xcaf0a18f4a177175ULL, 0x61655d9860ec7f13ULL,
+ 0xe77fbc9dc19e4430ULL, 0x2ccff441ddd440a5ULL,
+ 0x16e97aaee06a20dcULL, 0xa855dae2d01c915bULL,
+ 0x1d1347f9905f30b2ULL, 0xb7c652bdecf94b34ULL,
+ 0xd03e43d265c6175dULL, 0xfdb15ec0ee4f2218ULL,
+ 0x57644b8492e9599eULL, 0x07dda5a4bf8e569aULL,
+ 0x54a46d71680ec6a3ULL, 0x5624a2d7c4b42c7eULL,
+ 0xbebca04c3076b187ULL, 0x7d36f332a6ee3a41ULL,
+ 0x3b6667bc6be31599ULL, 0x695f463aea3ef040ULL,
+ 0xad08b0e0c3282d1cULL, 0xb15b1e4a052a684eULL,
+ 0x44d05b2861b7c505ULL, 0x15295c5b1a8dbfe1ULL,
+ 0x744c01c37a61c0f2ULL, 0x59c31cd1f1e8f5b7ULL,
+ 0xef45a73f4b4ccb63ULL, 0x6bdf899c46841a9dULL,
+ 0x3dfb2b4b823036e3ULL, 0xa2ef0ee6f674f4d5ULL,
+ 0x184e2dfb836b8cf5ULL, 0x1134df0a5fe47646ULL,
+ 0xbaa1231d751f7820ULL, 0xd17eaa81339b62bdULL,
+ 0xb01bf71953771daeULL, 0x849a2ea30dc8d1feULL,
+ 0x705182923f080955ULL, 0x0ea757556301ac29ULL,
+ 0x041d83514569c9a7ULL, 0x0abad4042668658eULL,
+ 0x49b72a88f851f611ULL, 0x8a3d79f66ec97dd7ULL,
+ 0xcd2d042bf59927efULL, 0xc930877ab0f0ee48ULL,
+ 0x9273540deda2f122ULL, 0xc797d02fd3f14261ULL,
+ 0xe1e2f06a284d674aULL, 0xd2be8c74c97cfd80ULL,
+ 0x9a494faf67707e71ULL, 0xb3dbd1eca9908293ULL,
+ 0x72d14d3493b2e388ULL, 0xd6a30f258c153427ULL },
+};
+
+static const uint64_t C16[12][8] =
+{
+ { 0xdd806559f2a64507ULL, 0x05767436cc744d23ULL,
+ 0xa2422a08a460d315ULL, 0x4b7ce09192676901ULL,
+ 0x714eb88d7585c4fcULL, 0x2f6a76432e45d016ULL,
+ 0xebcb2f81c0657c1fULL, 0xb1085bda1ecadae9ULL },
+ { 0xe679047021b19bb7ULL, 0x55dda21bd7cbcd56ULL,
+ 0x5cb561c2db0aa7caULL, 0x9ab5176b12d69958ULL,
+ 0x61d55e0f16b50131ULL, 0xf3feea720a232b98ULL,
+ 0x4fe39d460f70b5d7ULL, 0x6fa3b58aa99d2f1aULL },
+ { 0x991e96f50aba0ab2ULL, 0xc2b6f443867adb31ULL,
+ 0xc1c93a376062db09ULL, 0xd3e20fe490359eb1ULL,
+ 0xf2ea7514b1297b7bULL, 0x06f15e5f529c1f8bULL,
+ 0x0a39fc286a3d8435ULL, 0xf574dcac2bce2fc7ULL },
+ { 0x220cbebc84e3d12eULL, 0x3453eaa193e837f1ULL,
+ 0xd8b71333935203beULL, 0xa9d72c82ed03d675ULL,
+ 0x9d721cad685e353fULL, 0x488e857e335c3c7dULL,
+ 0xf948e1a05d71e4ddULL, 0xef1fdfb3e81566d2ULL },
+ { 0x601758fd7c6cfe57ULL, 0x7a56a27ea9ea63f5ULL,
+ 0xdfff00b723271a16ULL, 0xbfcd1747253af5a3ULL,
+ 0x359e35d7800fffbdULL, 0x7f151c1f1686104aULL,
+ 0x9a3f410c6ca92363ULL, 0x4bea6bacad474799ULL },
+ { 0xfa68407a46647d6eULL, 0xbf71c57236904f35ULL,
+ 0x0af21f66c2bec6b6ULL, 0xcffaa6b71c9ab7b4ULL,
+ 0x187f9ab49af08ec6ULL, 0x2d66c4f95142a46cULL,
+ 0x6fa4c33b7a3039c0ULL, 0xae4faeae1d3ad3d9ULL },
+ { 0x8886564d3a14d493ULL, 0x3517454ca23c4af3ULL,
+ 0x06476983284a0504ULL, 0x0992abc52d822c37ULL,
+ 0xd3473e33197a93c9ULL, 0x399ec6c7e6bf87c9ULL,
+ 0x51ac86febf240954ULL, 0xf4c70e16eeaac5ecULL },
+ { 0xa47f0dd4bf02e71eULL, 0x36acc2355951a8d9ULL,
+ 0x69d18d2bd1a5c42fULL, 0xf4892bcb929b0690ULL,
+ 0x89b4443b4ddbc49aULL, 0x4eb7f8719c36de1eULL,
+ 0x03e7aa020c6e4141ULL, 0x9b1f5b424d93c9a7ULL },
+ { 0x7261445183235adbULL, 0x0e38dc92cb1f2a60ULL,
+ 0x7b2b8a9aa6079c54ULL, 0x800a440bdbb2ceb1ULL,
+ 0x3cd955b7e00d0984ULL, 0x3a7d3a1b25894224ULL,
+ 0x944c9ad8ec165fdeULL, 0x378f5a541631229bULL },
+ { 0x74b4c7fb98459cedULL, 0x3698fad1153bb6c3ULL,
+ 0x7a1e6c303b7652f4ULL, 0x9fe76702af69334bULL,
+ 0x1fffe18a1b336103ULL, 0x8941e71cff8a78dbULL,
+ 0x382ae548b2e4f3f3ULL, 0xabbedea680056f52ULL },
+ { 0x6bcaa4cd81f32d1bULL, 0xdea2594ac06fd85dULL,
+ 0xefbacd1d7d476e98ULL, 0x8a1d71efea48b9caULL,
+ 0x2001802114846679ULL, 0xd8fa6bbbebab0761ULL,
+ 0x3002c6cd635afe94ULL, 0x7bcd9ed0efc889fbULL },
+ { 0x48bc924af11bd720ULL, 0xfaf417d5d9b21b99ULL,
+ 0xe71da4aa88e12852ULL, 0x5d80ef9d1891cc86ULL,
+ 0xf82012d430219f9bULL, 0xcda43c32bcdf1d77ULL,
+ 0xd21380b00449b17aULL, 0x378ee767f11631baULL },
+};
+
+#define strido(out, temp, i) do { \
+ uint64_t t; \
+ t = streebog_table[0][(temp[0] >> (i * 8)) & 0xff]; \
+ t ^= streebog_table[1][(temp[1] >> (i * 8)) & 0xff]; \
+ t ^= streebog_table[2][(temp[2] >> (i * 8)) & 0xff]; \
+ t ^= streebog_table[3][(temp[3] >> (i * 8)) & 0xff]; \
+ t ^= streebog_table[4][(temp[4] >> (i * 8)) & 0xff]; \
+ t ^= streebog_table[5][(temp[5] >> (i * 8)) & 0xff]; \
+ t ^= streebog_table[6][(temp[6] >> (i * 8)) & 0xff]; \
+ t ^= streebog_table[7][(temp[7] >> (i * 8)) & 0xff]; \
+ out[i] = t; } while(0)
+
+static void LPSX (uint64_t *out, const uint64_t *a, const uint64_t *b)
+{
+ uint64_t temp[8];
+ temp[0] = a[0] ^ b[0];
+ temp[1] = a[1] ^ b[1];
+ temp[2] = a[2] ^ b[2];
+ temp[3] = a[3] ^ b[3];
+ temp[4] = a[4] ^ b[4];
+ temp[5] = a[5] ^ b[5];
+ temp[6] = a[6] ^ b[6];
+ temp[7] = a[7] ^ b[7];
+ strido (out, temp, 0);
+ strido (out, temp, 1);
+ strido (out, temp, 2);
+ strido (out, temp, 3);
+ strido (out, temp, 4);
+ strido (out, temp, 5);
+ strido (out, temp, 6);
+ strido (out, temp, 7);
+}
+
+static inline void g (uint64_t *h, uint64_t *m, uint64_t *N)
+{
+ uint64_t K[8];
+ uint64_t T[8];
+ int i;
+
+ LPSX (K, h, N);
+
+ LPSX (T, K, m);
+ LPSX (K, K, C16[0]);
+ for (i = 1; i < 12; i++)
+ {
+ LPSX (T, K, T);
+ LPSX (K, K, C16[i]);
+ }
+
+ h[0] ^= T[0] ^ K[0] ^ m[0];
+ h[1] ^= T[1] ^ K[1] ^ m[1];
+ h[2] ^= T[2] ^ K[2] ^ m[2];
+ h[3] ^= T[3] ^ K[3] ^ m[3];
+ h[4] ^= T[4] ^ K[4] ^ m[4];
+ h[5] ^= T[5] ^ K[5] ^ m[5];
+ h[6] ^= T[6] ^ K[6] ^ m[6];
+ h[7] ^= T[7] ^ K[7] ^ m[7];
+}
+
+
+static void
+streebog512_compress (struct streebog512_ctx *ctx, const uint8_t *input, size_t count)
+{
+ uint64_t M[8];
+ uint64_t l;
+ int i;
+
+ for (i = 0; i < 8; i++, input += 8)
+ M[i] = LE_READ_UINT64(input);
+
+ g (ctx->state, M, ctx->count);
+ l = ctx->count[0];
+ ctx->count[0] += count;
+ if (ctx->count[0] < l)
+ { /* overflow */
+ for (i = 1; i < 8; i++)
+ {
+ ctx->count[i]++;
+ if (ctx->count[i] != 0)
+ break;
+ }
+ }
+
+ ctx->sigma[0] += M[0];
+ for (i = 1; i < 8; i++)
+ if (ctx->sigma[i-1] < M[i-1])
+ ctx->sigma[i] += M[i] + 1;
+ else
+ ctx->sigma[i] += M[i];
+}
+
+static void
+streebog_final (struct streebog512_ctx *ctx)
+{
+ uint64_t Z[8] = {};
+ unsigned int i;
+
+ /* PAD. It does not count towards message length */
+ i = ctx->index;
+ /* We have at least one byte free) */
+ ctx->block[i++] = 1;
+ while (i < 64)
+ ctx->block[i++] = 0;
+ streebog512_compress (ctx, ctx->block, ctx->index * 8);
+
+ g (ctx->state, ctx->count, Z);
+ g (ctx->state, ctx->sigma, Z);
+}
+
+#define COMPRESS(ctx, data) (streebog512_compress((ctx), (data), 64 * 8))
+
+void
+streebog512_init(struct streebog512_ctx *ctx)
+{
+ memset(ctx->state, 0, sizeof(ctx->state));
+ memset(ctx->count, 0, sizeof(ctx->count));
+ memset(ctx->sigma, 0, sizeof(ctx->sigma));
+
+ /* Initialize buffer */
+ ctx->index = 0;
+}
+
+void
+streebog512_update(struct streebog512_ctx *ctx,
+ size_t length, const uint8_t *data)
+{
+ MD_UPDATE (ctx, length, data, COMPRESS, (void)0);
+}
+
+static void
+streebog512_write_digest(struct streebog512_ctx *ctx,
+ size_t offset, size_t length,
+ uint8_t *digest)
+{
+ unsigned i;
+ unsigned words;
+ unsigned leftover;
+
+ assert(offset + length <= STREEBOG512_DIGEST_SIZE);
+
+ streebog_final(ctx);
+
+ words = length / 8;
+ leftover = length % 8;
+
+ for (i = 0; i < words; i++, digest += 8)
+ LE_WRITE_UINT64(digest, ctx->state[offset + i]);
+
+ if (leftover)
+ {
+ /* Truncate to the right size */
+ uint64_t word = ctx->state[offset + i] << (8*(8 - leftover));
+
+ do {
+ digest[--leftover] = (word >> 56) & 0xff;
+ word <<= 8;
+ } while (leftover);
+ }
+}
+
+void
+streebog512_digest(struct streebog512_ctx *ctx,
+ size_t length,
+ uint8_t *digest)
+{
+ assert(length <= STREEBOG512_DIGEST_SIZE);
+
+ streebog512_write_digest(ctx, 0, length, digest);
+ streebog512_init(ctx);
+}
+
+void
+streebog256_init(struct streebog256_ctx *ctx)
+{
+ memset(ctx->state, 1, sizeof(ctx->state));
+ memset(ctx->count, 0, sizeof(ctx->count));
+ memset(ctx->sigma, 0, sizeof(ctx->sigma));
+
+ /* Initialize buffer */
+ ctx->index = 0;
+}
+
+void
+streebog256_digest(struct streebog256_ctx *ctx,
+ size_t length,
+ uint8_t *digest)
+{
+ assert(length <= STREEBOG256_DIGEST_SIZE);
+
+ streebog512_write_digest(ctx,
+ 4,
+ length,
+ digest);
+ streebog256_init(ctx);
+}
diff --git a/lib/nettle/gost/streebog.h b/lib/nettle/gost/streebog.h
new file mode 100644
index 0000000000..9a8d84c753
--- /dev/null
+++ b/lib/nettle/gost/streebog.h
@@ -0,0 +1,105 @@
+/* streebog.h
+
+ The Streebog family of hash functions.
+
+ Copyright (C) 2015 Dmitry Eremin-Solenikov
+
+ This file is part of GNU Nettle.
+
+ GNU Nettle is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ or both in parallel, as here.
+
+ GNU Nettle is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see http://www.gnu.org/licenses/.
+*/
+
+#ifndef NETTLE_STREEBOG_H_INCLUDED
+#define NETTLE_STREEBOG_H_INCLUDED
+
+#include <nettle/nettle-types.h>
+#include <nettle/nettle-meta.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Name mangling */
+#define streebog256_init _gnutls_streebog256_init
+#define streebog256_digest _gnutls_streebog256_digest
+#define streebog512_init _gnutls_streebog512_init
+#define streebog512_update _gnutls_streebog512_update
+#define streebog512_digest _gnutls_streebog512_digest
+
+/* STREEBOG512 */
+
+#define STREEBOG512_DIGEST_SIZE 64
+#define STREEBOG512_BLOCK_SIZE 64
+
+/* Digest is kept internally as 8 64-bit words. */
+#define _STREEBOG512_DIGEST_LENGTH 8
+
+struct streebog512_ctx
+{
+ uint64_t state[_STREEBOG512_DIGEST_LENGTH]; /* State variables */
+ uint64_t count[_STREEBOG512_DIGEST_LENGTH];
+ uint64_t sigma[_STREEBOG512_DIGEST_LENGTH];
+ uint8_t block[STREEBOG512_BLOCK_SIZE]; /* STREEBOG512 data buffer */
+ unsigned int index; /* index into buffer */
+};
+
+void
+streebog512_init(struct streebog512_ctx *ctx);
+
+void
+streebog512_update(struct streebog512_ctx *ctx,
+ size_t length,
+ const uint8_t *data);
+
+void
+streebog512_digest(struct streebog512_ctx *ctx,
+ size_t length,
+ uint8_t *digest);
+
+
+#define STREEBOG256_DIGEST_SIZE 32
+#define STREEBOG256_BLOCK_SIZE STREEBOG512_BLOCK_SIZE
+#define streebog256_ctx streebog512_ctx
+
+void
+streebog256_init(struct streebog256_ctx *ctx);
+
+#define streebog256_update _gnutls_streebog512_update
+
+void
+streebog256_digest(struct streebog256_ctx *ctx,
+ size_t length,
+ uint8_t *digest);
+
+#define nettle_streebog256 _gnutls_streebog256
+#define nettle_streebog512 _gnutls_streebog512
+extern const struct nettle_hash _gnutls_streebog256;
+extern const struct nettle_hash _gnutls_streebog512;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NETTLE_STREEBOG_H_INCLUDED */
diff --git a/lib/nettle/mac.c b/lib/nettle/mac.c
index 68fb478849..e46862d215 100644
--- a/lib/nettle/mac.c
+++ b/lib/nettle/mac.c
@@ -32,6 +32,11 @@
#include <nettle/sha3.h>
#include <nettle/hmac.h>
#include <nettle/umac.h>
+#if ENABLE_GOST
+#include "gost/hmac-gost.h"
+#include "gost/gosthash94.h"
+#include "gost/streebog.h"
+#endif
typedef void (*update_func) (void *, size_t, const uint8_t *);
typedef void (*digest_func) (void *, size_t, uint8_t *);
@@ -60,6 +65,11 @@ struct nettle_hash_ctx {
struct sha1_ctx sha1;
struct md2_ctx md2;
struct md5_sha1_ctx md5_sha1;
+#if ENABLE_GOST
+ struct gosthash94cp_ctx gosthash94cp;
+ struct streebog256_ctx streebog256;
+ struct streebog512_ctx streebog512;
+#endif
} ctx;
void *ctx_ptr;
gnutls_digest_algorithm_t algo;
@@ -76,6 +86,11 @@ struct nettle_mac_ctx {
struct hmac_sha384_ctx sha384;
struct hmac_sha512_ctx sha512;
struct hmac_sha1_ctx sha1;
+#if ENABLE_GOST
+ struct hmac_gosthash94cp_ctx gosthash94cp;
+ struct hmac_streebog256_ctx streebog256;
+ struct hmac_streebog512_ctx streebog512;
+#endif
struct umac96_ctx umac96;
struct umac128_ctx umac128;
} ctx;
@@ -155,6 +170,29 @@ static int _mac_ctx_init(gnutls_mac_algorithm_t algo,
ctx->ctx_ptr = &ctx->ctx.sha512;
ctx->length = SHA512_DIGEST_SIZE;
break;
+#if ENABLE_GOST
+ case GNUTLS_MAC_GOSTR_94:
+ ctx->update = (update_func) hmac_gosthash94cp_update;
+ ctx->digest = (digest_func) hmac_gosthash94cp_digest;
+ ctx->set_key = (set_key_func) hmac_gosthash94cp_set_key;
+ ctx->ctx_ptr = &ctx->ctx.gosthash94cp;
+ ctx->length = GOSTHASH94CP_DIGEST_SIZE;
+ break;
+ case GNUTLS_MAC_STREEBOG_256:
+ ctx->update = (update_func) hmac_streebog256_update;
+ ctx->digest = (digest_func) hmac_streebog256_digest;
+ ctx->set_key = (set_key_func) hmac_streebog256_set_key;
+ ctx->ctx_ptr = &ctx->ctx.streebog256;
+ ctx->length = STREEBOG256_DIGEST_SIZE;
+ break;
+ case GNUTLS_MAC_STREEBOG_512:
+ ctx->update = (update_func) hmac_streebog512_update;
+ ctx->digest = (digest_func) hmac_streebog512_digest;
+ ctx->set_key = (set_key_func) hmac_streebog512_set_key;
+ ctx->ctx_ptr = &ctx->ctx.streebog512;
+ ctx->length = STREEBOG512_DIGEST_SIZE;
+ break;
+#endif
case GNUTLS_MAC_UMAC_96:
ctx->update = (update_func) umac96_update;
ctx->digest = (digest_func) umac96_digest;
@@ -214,6 +252,11 @@ static int wrap_nettle_mac_exists(gnutls_mac_algorithm_t algo)
case GNUTLS_MAC_SHA512:
case GNUTLS_MAC_UMAC_96:
case GNUTLS_MAC_UMAC_128:
+#if ENABLE_GOST
+ case GNUTLS_MAC_GOSTR_94:
+ case GNUTLS_MAC_STREEBOG_256:
+ case GNUTLS_MAC_STREEBOG_512:
+#endif
return 1;
default:
return 0;
@@ -339,6 +382,11 @@ static int wrap_nettle_hash_exists(gnutls_digest_algorithm_t algo)
return 0;
#endif
case GNUTLS_DIG_MD2:
+#if ENABLE_GOST
+ case GNUTLS_DIG_GOSTR_94:
+ case GNUTLS_DIG_STREEBOG_256:
+ case GNUTLS_DIG_STREEBOG_512:
+#endif
return 1;
default:
return 0;
@@ -458,6 +506,29 @@ static int _ctx_init(gnutls_digest_algorithm_t algo,
ctx->ctx_ptr = &ctx->ctx.md2;
ctx->length = MD2_DIGEST_SIZE;
break;
+#if ENABLE_GOST
+ case GNUTLS_DIG_GOSTR_94:
+ gosthash94cp_init(&ctx->ctx.gosthash94cp);
+ ctx->update = (update_func) gosthash94cp_update;
+ ctx->digest = (digest_func) gosthash94cp_digest;
+ ctx->ctx_ptr = &ctx->ctx.gosthash94cp;
+ ctx->length = GOSTHASH94_DIGEST_SIZE;
+ break;
+ case GNUTLS_DIG_STREEBOG_256:
+ streebog256_init(&ctx->ctx.streebog256);
+ ctx->update = (update_func) streebog256_update;
+ ctx->digest = (digest_func) streebog256_digest;
+ ctx->ctx_ptr = &ctx->ctx.streebog256;
+ ctx->length = STREEBOG256_DIGEST_SIZE;
+ break;
+ case GNUTLS_DIG_STREEBOG_512:
+ streebog512_init(&ctx->ctx.streebog512);
+ ctx->update = (update_func) streebog512_update;
+ ctx->digest = (digest_func) streebog512_digest;
+ ctx->ctx_ptr = &ctx->ctx.streebog512;
+ ctx->length = STREEBOG512_DIGEST_SIZE;
+ break;
+#endif
default:
gnutls_assert();
return GNUTLS_E_INVALID_REQUEST;
diff --git a/lib/nettle/mpi.c b/lib/nettle/mpi.c
index c45aa3e0ae..8a93ac2786 100644
--- a/lib/nettle/mpi.c
+++ b/lib/nettle/mpi.c
@@ -29,6 +29,9 @@
#include <num.h>
#include <mpi.h>
#include <nettle/bignum.h> /* includes gmp.h */
+#if ENABLE_GOST
+#include "gost/bignum-le.h"
+#endif
#include <gnettle.h>
#include <random.h>
@@ -43,6 +46,10 @@ wrap_nettle_mpi_print(const bigint_t a, void *buffer, size_t * nbytes,
size = nettle_mpz_sizeinbase_256_u(*p);
} else if (format == GNUTLS_MPI_FORMAT_STD) {
size = nettle_mpz_sizeinbase_256_s(*p);
+#if ENABLE_GOST
+ } else if (format == GNUTLS_MPI_FORMAT_ULE) {
+ size = nettle_mpz_sizeinbase_256_u_le(*p);
+#endif
} else {
gnutls_assert();
return GNUTLS_E_INVALID_REQUEST;
@@ -50,11 +57,16 @@ wrap_nettle_mpi_print(const bigint_t a, void *buffer, size_t * nbytes,
if (buffer == NULL || size > *nbytes) {
*nbytes = size;
+ gnutls_assert();
return GNUTLS_E_SHORT_MEMORY_BUFFER;
}
- nettle_mpz_get_str_256(size, buffer, *p);
-
+#if ENABLE_GOST
+ if (format == GNUTLS_MPI_FORMAT_ULE)
+ nettle_mpz_get_str_256_u_le(size, buffer, *p);
+ else
+#endif
+ nettle_mpz_get_str_256(size, buffer, *p);
*nbytes = size;
return 0;
@@ -136,6 +148,10 @@ wrap_nettle_mpi_scan(bigint_t r, const void *buffer, size_t nbytes,
nettle_mpz_set_str_256_u(TOMPZ(r), nbytes, buffer);
} else if (format == GNUTLS_MPI_FORMAT_STD) {
nettle_mpz_set_str_256_s(TOMPZ(r), nbytes, buffer);
+#if ENABLE_GOST
+ } else if (format == GNUTLS_MPI_FORMAT_ULE) {
+ nettle_mpz_set_str_256_u_le(TOMPZ(r), nbytes, buffer);
+#endif
} else {
gnutls_assert();
goto fail;
diff --git a/lib/nettle/pk.c b/lib/nettle/pk.c
index dddd7804ec..a54044dc4d 100644
--- a/lib/nettle/pk.c
+++ b/lib/nettle/pk.c
@@ -50,10 +50,15 @@
#include <nettle/curve25519.h>
#include <nettle/eddsa.h>
#include <nettle/version.h>
+#if ENABLE_GOST
+#include "gost/gostdsa.h"
+#include "gost/ecc-gost-curve.h"
+#endif
#include <gnettle.h>
#include <fips.h>
static inline const struct ecc_curve *get_supported_nist_curve(int curve);
+static inline const struct ecc_curve *get_supported_gost_curve(int curve);
/* When these callbacks are used for a nettle operation, the
* caller must check the macro HAVE_LIB_ERROR() after the operation
@@ -164,6 +169,36 @@ _ecc_params_to_pubkey(const gnutls_pk_params_st * pk_params,
return 0;
}
+#if ENABLE_GOST
+static int
+_gost_params_to_privkey(const gnutls_pk_params_st * pk_params,
+ struct ecc_scalar *priv,
+ const struct ecc_curve *curve)
+{
+ ecc_scalar_init(priv, curve);
+ if (ecc_scalar_set(priv, pk_params->params[GOST_K]) == 0) {
+ ecc_scalar_clear(priv);
+ return gnutls_assert_val(GNUTLS_E_PK_INVALID_PRIVKEY);
+ }
+
+ return 0;
+}
+
+static int
+_gost_params_to_pubkey(const gnutls_pk_params_st * pk_params,
+ struct ecc_point *pub, const struct ecc_curve *curve)
+{
+ ecc_point_init(pub, curve);
+ if (ecc_point_set
+ (pub, pk_params->params[GOST_X], pk_params->params[GOST_Y]) == 0) {
+ ecc_point_clear(pub);
+ return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+ }
+
+ return 0;
+}
+#endif
+
static void
ecc_shared_secret(struct ecc_scalar *private_key,
struct ecc_point *public_key, void *out, unsigned size)
@@ -617,6 +652,58 @@ _wrap_nettle_pk_sign(gnutls_pk_algorithm_t algo,
break;
}
+#if ENABLE_GOST
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ {
+ struct ecc_scalar priv;
+ struct dsa_signature sig;
+ const struct ecc_curve *curve;
+
+ curve = get_supported_gost_curve(pk_params->curve);
+ if (curve == NULL)
+ return
+ gnutls_assert_val
+ (GNUTLS_E_ECC_UNSUPPORTED_CURVE);
+
+ ret =
+ _ecc_params_to_privkey(pk_params, &priv,
+ curve);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+
+ /* This call will return a valid MAC entry and
+ * getters will check that is not null anyway. */
+ me = mac_to_entry(_gnutls_gost_digest(pk_params->algo));
+ if (_gnutls_mac_get_algo_len(me) != vdata->size) {
+ gnutls_assert();
+ _gnutls_debug_log
+ ("Security level of algorithm requires hash %s(%zd)\n",
+ _gnutls_mac_get_name(me),
+ _gnutls_mac_get_algo_len(me));
+ return GNUTLS_E_INVALID_REQUEST;
+ }
+
+ dsa_signature_init(&sig);
+
+ gostdsa_sign(&priv, NULL, rnd_tmpkey_func,
+ vdata->size, vdata->data, &sig);
+
+ ret =
+ _gnutls_encode_gost_rs(signature, &sig.r, &sig.s,
+ (ecc_bit_size(curve) + 7) / 8);
+
+ dsa_signature_clear(&sig);
+ ecc_scalar_zclear(&priv);
+
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+ break;
+ }
+#endif
case GNUTLS_PK_ECDSA: /* we do ECDSA */
{
struct ecc_scalar priv;
@@ -894,6 +981,55 @@ _wrap_nettle_pk_verify(gnutls_pk_algorithm_t algo,
}
break;
}
+#if ENABLE_GOST
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ {
+ struct ecc_point pub;
+ struct dsa_signature sig;
+ const struct ecc_curve *curve;
+ const mac_entry_st *me;
+
+ curve = get_supported_gost_curve(pk_params->curve);
+ if (curve == NULL)
+ return
+ gnutls_assert_val
+ (GNUTLS_E_ECC_UNSUPPORTED_CURVE);
+
+ /* This call will return a valid MAC entry and
+ * getters will check that is not null anyway. */
+ me = mac_to_entry(_gnutls_gost_digest(pk_params->algo));
+ if (_gnutls_mac_get_algo_len(me) != vdata->size)
+ return gnutls_assert_val(GNUTLS_E_PK_SIG_VERIFY_FAILED);
+
+ ret =
+ _gnutls_decode_gost_rs(signature, &tmp[0],
+ &tmp[1]);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+
+ ret =
+ _gost_params_to_pubkey(pk_params, &pub, curve);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+
+ memcpy(sig.r, tmp[0], SIZEOF_MPZT);
+ memcpy(sig.s, tmp[1], SIZEOF_MPZT);
+
+ ret = gostdsa_verify(&pub, vdata->size, vdata->data, &sig);
+ if (ret == 0) {
+ gnutls_assert();
+ ret = GNUTLS_E_PK_SIG_VERIFY_FAILED;
+ } else
+ ret = 0;
+
+ ecc_point_clear(&pub);
+ break;
+ }
+#endif
case GNUTLS_PK_ECDSA: /* ECDSA */
{
struct ecc_point pub;
@@ -1089,6 +1225,22 @@ static inline const struct ecc_curve *get_supported_nist_curve(int curve)
}
}
+static inline const struct ecc_curve *get_supported_gost_curve(int curve)
+{
+ switch (curve) {
+#if ENABLE_GOST
+ case GNUTLS_ECC_CURVE_GOST256CPA:
+ return nettle_get_gost_256cpa();
+ case GNUTLS_ECC_CURVE_GOST256CPXA:
+ return nettle_get_gost_256cpa();
+ case GNUTLS_ECC_CURVE_GOST512A:
+ return nettle_get_gost_512a();
+#endif
+ default:
+ return NULL;
+ }
+}
+
static int _wrap_nettle_pk_curve_exists(gnutls_ecc_curve_t curve)
{
switch (curve) {
@@ -1096,7 +1248,8 @@ static int _wrap_nettle_pk_curve_exists(gnutls_ecc_curve_t curve)
case GNUTLS_ECC_CURVE_X25519:
return 1;
default:
- return ((get_supported_nist_curve(curve)!=NULL)?1:0);
+ return ((get_supported_nist_curve(curve)!=NULL ||
+ get_supported_gost_curve(curve)!=NULL)?1:0);
}
}
@@ -1218,6 +1371,11 @@ wrap_nettle_pk_generate_params(gnutls_pk_algorithm_t algo,
case GNUTLS_PK_RSA:
case GNUTLS_PK_ECDSA:
case GNUTLS_PK_EDDSA_ED25519:
+#if ENABLE_GOST
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+#endif
break;
default:
gnutls_assert();
@@ -1504,6 +1662,12 @@ gnutls_x509_spki_st spki;
ddata.data = (void*)gen_data;
ddata.size = hash_len;
+ } else if (algo == GNUTLS_PK_GOST_01 || algo == GNUTLS_PK_GOST_12_256) {
+ ddata.data = (void*)const_data_sha256;
+ ddata.size = sizeof(const_data_sha256);
+ } else if (algo == GNUTLS_PK_GOST_12_512) {
+ ddata.data = (void*)const_data_sha512;
+ ddata.size = sizeof(const_data_sha512);
} else if (algo == GNUTLS_PK_RSA_PSS) {
if (spki.rsa_pss_dig == GNUTLS_DIG_UNKNOWN)
spki.rsa_pss_dig = GNUTLS_DIG_SHA256;
@@ -1565,6 +1729,9 @@ gnutls_x509_spki_st spki;
case GNUTLS_PK_EDDSA_ED25519:
case GNUTLS_PK_DSA:
case GNUTLS_PK_RSA_PSS:
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
ret = _gnutls_pk_sign(algo, &sig, &ddata, params, &spki);
if (ret < 0) {
ret = gnutls_assert_val(GNUTLS_E_PK_GENERATION_ERROR);
@@ -1912,6 +2079,65 @@ wrap_nettle_pk_generate_keys(gnutls_pk_algorithm_t algo,
break;
}
+#if ENABLE_GOST
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ if (params->pkflags & GNUTLS_PK_FLAG_PROVABLE)
+ return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+
+ {
+ struct ecc_scalar key;
+ struct ecc_point pub;
+ const struct ecc_curve *curve;
+ const mac_entry_st *me;
+
+ curve = get_supported_gost_curve(level);
+ if (curve == NULL)
+ return
+ gnutls_assert_val
+ (GNUTLS_E_ECC_UNSUPPORTED_CURVE);
+
+ me = hash_to_entry(_gnutls_gost_digest(algo));
+ if (!me || me->output_size * 8 != ecc_bit_size(curve))
+ return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+
+ ecc_scalar_init(&key, curve);
+ ecc_point_init(&pub, curve);
+
+ gostdsa_generate_keypair(&pub, &key, NULL, rnd_key_func);
+ if (HAVE_LIB_ERROR()) {
+ ret = gnutls_assert_val(GNUTLS_E_LIB_IN_ERROR_STATE);
+ goto ecc_fail;
+ }
+
+
+ ret = _gnutls_mpi_init_multi(&params->params[GOST_X], &params->params[GOST_Y],
+ &params->params[GOST_K], NULL);
+ if (ret < 0) {
+ gnutls_assert();
+ goto gost_fail;
+ }
+
+ params->curve = level;
+ params->params_nr = GOST_PRIVATE_PARAMS;
+
+ ecc_point_get(&pub, TOMPZ(params->params[GOST_X]),
+ TOMPZ(params->params[GOST_Y]));
+ ecc_scalar_get(&key, TOMPZ(params->params[GOST_K]));
+
+ ret = 0;
+
+ gost_fail:
+ ecc_point_clear(&pub);
+ ecc_scalar_clear(&key);
+
+ if (ret < 0)
+ goto fail;
+
+ break;
+ }
+#endif
case GNUTLS_PK_ECDH_X25519:
{
unsigned size = gnutls_ecc_curve_get_size(level);
@@ -2192,6 +2418,83 @@ wrap_nettle_pk_verify_priv_params(gnutls_pk_algorithm_t algo,
ret = 0;
break;
}
+#if ENABLE_GOST
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ {
+ struct ecc_point r, pub;
+ struct ecc_scalar priv;
+ mpz_t x1, y1, x2, y2;
+ const struct ecc_curve *curve;
+
+ if (params->params_nr != GOST_PRIVATE_PARAMS)
+ return
+ gnutls_assert_val
+ (GNUTLS_E_INVALID_REQUEST);
+
+ curve = get_supported_gost_curve(params->curve);
+ if (curve == NULL)
+ return
+ gnutls_assert_val
+ (GNUTLS_E_ECC_UNSUPPORTED_CURVE);
+
+ ret = _gost_params_to_pubkey(params, &pub, curve);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+
+ ret = _gost_params_to_privkey(params, &priv, curve);
+ if (ret < 0) {
+ ecc_point_clear(&pub);
+ return gnutls_assert_val(ret);
+ }
+
+ ecc_point_init(&r, curve);
+ /* verify that x,y lie on the curve */
+ ret =
+ ecc_point_set(&r, TOMPZ(params->params[GOST_X]),
+ TOMPZ(params->params[GOST_Y]));
+ if (ret == 0) {
+ ret =
+ gnutls_assert_val
+ (GNUTLS_E_ILLEGAL_PARAMETER);
+ goto gost_cleanup;
+ }
+ ecc_point_clear(&r);
+
+ ecc_point_init(&r, curve);
+ ecc_point_mul_g(&r, &priv);
+
+ mpz_init(x1);
+ mpz_init(y1);
+ ecc_point_get(&r, x1, y1);
+ ecc_point_zclear(&r);
+
+ mpz_init(x2);
+ mpz_init(y2);
+ ecc_point_get(&pub, x2, y2);
+
+ /* verify that k*(Gx,Gy)=(x,y) */
+ if (mpz_cmp(x1, x2) != 0 || mpz_cmp(y1, y2) != 0) {
+ ret =
+ gnutls_assert_val
+ (GNUTLS_E_ILLEGAL_PARAMETER);
+ goto gost_cleanup;
+ }
+
+ ret = 0;
+
+ gost_cleanup:
+ ecc_scalar_zclear(&priv);
+ ecc_point_clear(&pub);
+
+ mpz_clear(x1);
+ mpz_clear(y1);
+ mpz_clear(x2);
+ mpz_clear(y2);
+ }
+ break;
+#endif
default:
ret = gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
}
@@ -2251,6 +2554,50 @@ wrap_nettle_pk_verify_pub_params(gnutls_pk_algorithm_t algo,
ecc_point_clear(&pub);
}
break;
+#if ENABLE_GOST
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ {
+ /* just verify that x and y lie on the curve */
+ struct ecc_point r, pub;
+ const struct ecc_curve *curve;
+
+ if (params->params_nr != GOST_PUBLIC_PARAMS)
+ return
+ gnutls_assert_val
+ (GNUTLS_E_INVALID_REQUEST);
+
+ curve = get_supported_gost_curve(params->curve);
+ if (curve == NULL)
+ return
+ gnutls_assert_val
+ (GNUTLS_E_ECC_UNSUPPORTED_CURVE);
+
+ ret = _gost_params_to_pubkey(params, &pub, curve);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+
+ ecc_point_init(&r, curve);
+ /* verify that x,y lie on the curve */
+ ret =
+ ecc_point_set(&r, TOMPZ(params->params[GOST_X]),
+ TOMPZ(params->params[GOST_Y]));
+ if (ret == 0) {
+ ret =
+ gnutls_assert_val
+ (GNUTLS_E_ILLEGAL_PARAMETER);
+ goto gost_cleanup;
+ }
+ ecc_point_clear(&r);
+
+ ret = 0;
+
+ gost_cleanup:
+ ecc_point_clear(&pub);
+ }
+ break;
+#endif
default:
ret = gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
}
@@ -2380,7 +2727,38 @@ wrap_nettle_pk_fixup(gnutls_pk_algorithm_t algo,
}
}
+#if ENABLE_GOST
+ else if (algo == GNUTLS_PK_GOST_01 ||
+ algo == GNUTLS_PK_GOST_12_256 ||
+ algo == GNUTLS_PK_GOST_12_512) {
+ struct ecc_point r;
+ struct ecc_scalar priv;
+ const struct ecc_curve *curve;
+
+ if (params->params_nr != GOST_PRIVATE_PARAMS)
+ return gnutls_assert_val
+ (GNUTLS_E_INVALID_REQUEST);
+
+ curve = get_supported_gost_curve(params->curve);
+ if (curve == NULL)
+ return gnutls_assert_val
+ (GNUTLS_E_ECC_UNSUPPORTED_CURVE);
+
+ ret = _gost_params_to_privkey(params, &priv, curve);
+ if (ret < 0) {
+ return gnutls_assert_val(ret);
+ }
+
+ ecc_point_init(&r, curve);
+ ecc_point_mul_g(&r, &priv);
+ ecc_point_get(&r, params->params[GOST_X],
+ params->params[GOST_Y]);
+
+ ecc_point_clear(&r);
+ ecc_scalar_clear(&priv);
+ }
+#endif
return 0;
}
diff --git a/lib/pk.c b/lib/pk.c
index 3014396bc0..b4db8033e0 100644
--- a/lib/pk.c
+++ b/lib/pk.c
@@ -295,6 +295,170 @@ _gnutls_decode_ber_rs_raw(const gnutls_datum_t * sig_value, gnutls_datum_t *r,
return 0;
}
+int
+_gnutls_encode_gost_rs(gnutls_datum_t * sig_value, bigint_t r, bigint_t s,
+ size_t intsize)
+{
+ uint8_t *data;
+ int result;
+
+ data = gnutls_malloc(intsize * 2);
+ if (data == NULL) {
+ gnutls_assert();
+ return GNUTLS_E_MEMORY_ERROR;
+ }
+
+ if ((result = _gnutls_mpi_bprint_size(s, data, intsize)) < 0) {
+ gnutls_assert();
+ gnutls_free(data);
+ return result;
+ }
+
+ if ((result = _gnutls_mpi_bprint_size(r, data + intsize, intsize)) < 0) {
+ gnutls_assert();
+ gnutls_free(data);
+ return result;
+ }
+
+ sig_value->data = data;
+ sig_value->size = intsize * 2;
+
+ return 0;
+}
+
+int
+_gnutls_decode_gost_rs(const gnutls_datum_t * sig_value, bigint_t * r,
+ bigint_t * s)
+{
+ int ret;
+ unsigned halfsize = sig_value->size >> 1;
+
+ if (sig_value->size % 2 != 0) {
+ return gnutls_assert_val(GNUTLS_E_PARSING_ERROR);
+ }
+
+ ret = _gnutls_mpi_init_scan(s, sig_value->data, halfsize);
+ if (ret < 0)
+ return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
+
+ ret = _gnutls_mpi_init_scan(r, sig_value->data + halfsize, halfsize);
+ if (ret < 0) {
+ _gnutls_mpi_release(s);
+ return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
+ }
+
+ return 0;
+}
+
+/**
+ * gnutls_encode_gost_rs_value:
+ * @sig_value: will hold a GOST signature according to RFC 4491 section 2.2.2
+ * @r: must contain the r value
+ * @s: must contain the s value
+ *
+ * This function will encode the provided r and s values, into binary
+ * representation according to RFC 4491 section 2.2.2, used for GOST R
+ * 34.10-2001 (and thus also for GOST R 34.10-2012) signatures.
+ *
+ * The output value should be deallocated using gnutls_free().
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise
+ * an error code is returned.
+ *
+ * Since: 3.6.0
+ */
+int gnutls_encode_gost_rs_value(gnutls_datum_t * sig_value, const gnutls_datum_t * r, const gnutls_datum_t *s)
+{
+ uint8_t *data;
+ size_t intsize = r->size;
+
+ if (s->size != intsize) {
+ gnutls_assert();
+ return GNUTLS_E_ILLEGAL_PARAMETER;
+ }
+
+ data = gnutls_malloc(intsize * 2);
+ if (data == NULL) {
+ gnutls_assert();
+ return GNUTLS_E_MEMORY_ERROR;
+ }
+
+ memcpy(data, s->data, intsize);
+ memcpy(data + intsize, r->data, intsize);
+
+ sig_value->data = data;
+ sig_value->size = intsize * 2;
+
+ return 0;
+}
+
+/**
+ * gnutls_decode_gost_rs_value:
+ * @sig_value: will holds a GOST signature according to RFC 4491 section 2.2.2
+ * @r: will contain the r value
+ * @s: will contain the s value
+ *
+ * This function will decode the provided @sig_value, into @r and @s elements.
+ * See RFC 4491 section 2.2.2 for the format of signature value.
+ *
+ * The output values may be padded with a zero byte to prevent them
+ * from being interpreted as negative values. The value
+ * should be deallocated using gnutls_free().
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise
+ * an error code is returned.
+ *
+ * Since: 3.6.0
+ */
+int gnutls_decode_gost_rs_value(const gnutls_datum_t * sig_value, gnutls_datum_t * r, gnutls_datum_t * s)
+{
+ int ret;
+ unsigned halfsize = sig_value->size >> 1;
+
+ if (sig_value->size % 2 != 0)
+ return gnutls_assert_val(GNUTLS_E_PARSING_ERROR);
+
+ ret = _gnutls_set_datum(s, sig_value->data, halfsize);
+ if (ret != 0)
+ return gnutls_assert_val(ret);
+
+ ret = _gnutls_set_datum(r, sig_value->data + halfsize, halfsize);
+ if (ret != 0) {
+ _gnutls_free_datum(s);
+ return gnutls_assert_val(ret);
+ }
+
+ return 0;
+}
+
+gnutls_digest_algorithm_t _gnutls_gost_digest(gnutls_pk_algorithm_t pk)
+{
+ if (pk == GNUTLS_PK_GOST_01)
+ return GNUTLS_DIG_GOSTR_94;
+ else if (pk == GNUTLS_PK_GOST_12_256)
+ return GNUTLS_DIG_STREEBOG_256;
+ else if (pk == GNUTLS_PK_GOST_12_512)
+ return GNUTLS_DIG_STREEBOG_512;
+
+ gnutls_assert();
+
+ return GNUTLS_DIG_UNKNOWN;
+}
+
+gnutls_pk_algorithm_t _gnutls_digest_gost(gnutls_digest_algorithm_t digest)
+{
+ if (digest == GNUTLS_DIG_GOSTR_94)
+ return GNUTLS_PK_GOST_01;
+ else if (digest == GNUTLS_DIG_STREEBOG_256)
+ return GNUTLS_PK_GOST_12_256;
+ else if (digest == GNUTLS_DIG_STREEBOG_512)
+ return GNUTLS_PK_GOST_12_512;
+
+ gnutls_assert();
+
+ return GNUTLS_PK_UNKNOWN;
+}
+
/* some generic pk functions */
int _gnutls_pk_params_copy(gnutls_pk_params_st * dst,
@@ -310,6 +474,7 @@ int _gnutls_pk_params_copy(gnutls_pk_params_st * dst,
dst->pkflags = src->pkflags;
dst->curve = src->curve;
+ dst->gost_params = src->gost_params;
dst->qbits = src->qbits;
dst->algo = src->algo;
@@ -910,6 +1075,71 @@ int _gnutls_params_get_ecc_raw(const gnutls_pk_params_st* params,
}
+int _gnutls_params_get_gost_raw(const gnutls_pk_params_st* params,
+ gnutls_ecc_curve_t * curve,
+ gnutls_digest_algorithm_t * digest,
+ gnutls_gost_paramset_t * paramset,
+ gnutls_datum_t * x,
+ gnutls_datum_t * y,
+ gnutls_datum_t * k,
+ unsigned int flags)
+{
+ int ret;
+ mpi_dprint_func dprint = _gnutls_mpi_dprint_lz;
+
+ if (flags & GNUTLS_EXPORT_FLAG_NO_LZ)
+ dprint = _gnutls_mpi_dprint;
+
+
+ if (params == NULL) {
+ gnutls_assert();
+ return GNUTLS_E_INVALID_REQUEST;
+ }
+
+ if (curve)
+ *curve = params->curve;
+
+ if (digest)
+ *digest = _gnutls_gost_digest(params->algo);
+
+ if (paramset)
+ *paramset = params->gost_params;
+
+ /* X */
+ if (x) {
+ ret = dprint(params->params[GOST_X], x);
+ if (ret < 0) {
+ gnutls_assert();
+ return ret;
+ }
+ }
+
+ /* Y */
+ if (y) {
+ ret = dprint(params->params[GOST_Y], y);
+ if (ret < 0) {
+ gnutls_assert();
+ _gnutls_free_datum(x);
+ return ret;
+ }
+ }
+
+
+ /* K */
+ if (k) {
+ ret = dprint(params->params[GOST_K], k);
+ if (ret < 0) {
+ gnutls_assert();
+ _gnutls_free_datum(x);
+ _gnutls_free_datum(y);
+ return ret;
+ }
+ }
+
+ return 0;
+
+}
+
int
pk_hash_data(gnutls_pk_algorithm_t pk, const mac_entry_st * hash,
gnutls_pk_params_st * params,
@@ -971,6 +1201,9 @@ pk_prepare_hash(gnutls_pk_algorithm_t pk,
case GNUTLS_PK_DSA:
case GNUTLS_PK_ECDSA:
case GNUTLS_PK_EDDSA_ED25519:
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
break;
default:
gnutls_assert();
diff --git a/lib/pk.h b/lib/pk.h
index a6eb043333..1203c9ed1b 100644
--- a/lib/pk.h
+++ b/lib/pk.h
@@ -70,6 +70,17 @@ _gnutls_decode_ber_rs_raw(const gnutls_datum_t * sig_value, gnutls_datum_t *r,
gnutls_datum_t *s);
int
+_gnutls_encode_gost_rs(gnutls_datum_t * sig_value, bigint_t r, bigint_t s,
+ size_t intsize);
+
+int
+_gnutls_decode_gost_rs(const gnutls_datum_t * sig_value, bigint_t * r,
+ bigint_t * s);
+
+gnutls_digest_algorithm_t _gnutls_gost_digest(gnutls_pk_algorithm_t pk);
+gnutls_pk_algorithm_t _gnutls_digest_gost(gnutls_digest_algorithm_t digest);
+
+int
encode_ber_digest_info(const mac_entry_st * e,
const gnutls_datum_t * digest,
gnutls_datum_t * output);
@@ -98,6 +109,15 @@ int _gnutls_params_get_ecc_raw(const gnutls_pk_params_st* params,
gnutls_datum_t * k,
unsigned int flags);
+int _gnutls_params_get_gost_raw(const gnutls_pk_params_st* params,
+ gnutls_ecc_curve_t * curve,
+ gnutls_digest_algorithm_t * digest,
+ gnutls_gost_paramset_t * paramset,
+ gnutls_datum_t * x,
+ gnutls_datum_t * y,
+ gnutls_datum_t * k,
+ unsigned int flags);
+
int pk_prepare_hash(gnutls_pk_algorithm_t pk, const mac_entry_st * hash,
gnutls_datum_t * output);
int pk_hash_data(gnutls_pk_algorithm_t pk, const mac_entry_st * hash,
diff --git a/lib/pkix.asn b/lib/pkix.asn
index 47d14f9f23..22b5b8d9f6 100644
--- a/lib/pkix.asn
+++ b/lib/pkix.asn
@@ -368,6 +368,12 @@ pkcs-5-aes128-CBC-params ::= OCTET STRING (SIZE(16))
pkcs-5-aes192-CBC-params ::= OCTET STRING (SIZE(16))
pkcs-5-aes256-CBC-params ::= OCTET STRING (SIZE(16))
+-- GOST extension
+Gost28147-89-Parameters ::= SEQUENCE {
+ iv OCTET STRING, -- (SIZE (8))
+ encryptionParamSet OBJECT IDENTIFIER
+}
+
pkcs-5-PBE-params ::= SEQUENCE {
salt OCTET STRING,
iterationCount INTEGER }
diff --git a/lib/pkix_asn1_tab.c b/lib/pkix_asn1_tab.c
index 83086cdbb1..50f4196da0 100644
--- a/lib/pkix_asn1_tab.c
+++ b/lib/pkix_asn1_tab.c
@@ -271,6 +271,9 @@ const asn1_static_node pkix_asn1_tab[] = {
{ NULL, 1048586, "16"},
{ "pkcs-5-aes256-CBC-params", 1612709895, NULL },
{ NULL, 1048586, "16"},
+ { "Gost28147-89-Parameters", 1610612741, NULL },
+ { "iv", 1073741831, NULL },
+ { "encryptionParamSet", 12, NULL },
{ "pkcs-5-PBE-params", 1610612741, NULL },
{ "salt", 1073741831, NULL },
{ "iterationCount", 3, NULL },
diff --git a/lib/privkey.c b/lib/privkey.c
index e5b7e83965..ab2f2771b6 100644
--- a/lib/privkey.c
+++ b/lib/privkey.c
@@ -156,6 +156,7 @@ privkey_to_pubkey(gnutls_pk_algorithm_t pk,
pub->algo = priv->algo;
pub->pkflags = priv->pkflags;
pub->curve = priv->curve;
+ pub->gost_params = priv->gost_params;
pub->qbits = priv->qbits;
memcpy(&pub->spki, &priv->spki, sizeof(gnutls_x509_spki_st));
@@ -209,6 +210,21 @@ privkey_to_pubkey(gnutls_pk_algorithm_t pk,
return gnutls_assert_val(ret);
break;
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ pub->params[GOST_X] = _gnutls_mpi_copy(priv->params[GOST_X]);
+ pub->params[GOST_Y] = _gnutls_mpi_copy(priv->params[GOST_Y]);
+
+ pub->params_nr = GOST_PUBLIC_PARAMS;
+
+ if (pub->params[GOST_X] == NULL || pub->params[GOST_Y] == NULL) {
+ gnutls_assert();
+ ret = GNUTLS_E_MEMORY_ERROR;
+ goto cleanup;
+ }
+
+ break;
default:
gnutls_assert();
return GNUTLS_E_INVALID_REQUEST;
diff --git a/lib/privkey_raw.c b/lib/privkey_raw.c
index 8e231b1808..ff3e900394 100644
--- a/lib/privkey_raw.c
+++ b/lib/privkey_raw.c
@@ -260,6 +260,56 @@ int ret;
}
/**
+ * gnutls_privkey_export_gost_raw2:
+ * @key: Holds the public key
+ * @curve: will hold the curve
+ * @digest: will hold the digest
+ * @x: will hold the x coordinate
+ * @y: will hold the y coordinate
+ * @k: will hold the private key
+ * @flags: flags from %gnutls_abstract_export_flags_t
+ *
+ * This function will export the GOST private key's parameters found
+ * in the given structure. The new parameters will be allocated using
+ * gnutls_malloc() and will be stored in the appropriate datum.
+ *
+ * Returns: %GNUTLS_E_SUCCESS on success, otherwise a negative error code.
+ *
+ * Since: 3.6.3
+ **/
+int
+gnutls_privkey_export_gost_raw2(gnutls_privkey_t key,
+ gnutls_ecc_curve_t * curve,
+ gnutls_digest_algorithm_t * digest,
+ gnutls_gost_paramset_t * paramset,
+ gnutls_datum_t * x,
+ gnutls_datum_t * y,
+ gnutls_datum_t * k,
+ unsigned int flags)
+{
+ gnutls_pk_params_st params;
+ int ret;
+
+ if (key == NULL) {
+ gnutls_assert();
+ return GNUTLS_E_INVALID_REQUEST;
+ }
+
+ gnutls_pk_params_init(&params);
+
+ ret = _gnutls_privkey_get_mpis(key, &params);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+
+ ret = _gnutls_params_get_gost_raw(&params, curve, digest, paramset,
+ x, y, k, flags);
+
+ gnutls_pk_params_release(&params);
+
+ return ret;
+}
+
+/**
* gnutls_privkey_import_rsa_raw:
* @key: The structure to store the parsed key
* @m: holds the modulus
@@ -415,3 +465,55 @@ error:
return ret;
}
+/**
+ * gnutls_privkey_import_gost_raw:
+ * @key: The key
+ * @curve: holds the curve
+ * @digest: holds the digest
+ * @x: holds the x
+ * @y: holds the y
+ * @k: holds the k
+ *
+ * This function will convert the given GOST private key's parameters to the
+ * native #gnutls_privkey_t format. The output will be stored
+ * in @key.
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise a
+ * negative error value.
+ *
+ * Since: 3.6.3
+ **/
+int
+gnutls_privkey_import_gost_raw(gnutls_privkey_t key,
+ gnutls_ecc_curve_t curve,
+ gnutls_digest_algorithm_t digest,
+ gnutls_gost_paramset_t paramset,
+ const gnutls_datum_t * x,
+ const gnutls_datum_t * y,
+ const gnutls_datum_t * k)
+{
+ int ret;
+ gnutls_x509_privkey_t xkey;
+
+ ret = gnutls_x509_privkey_init(&xkey);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+
+ ret = gnutls_x509_privkey_import_gost_raw(xkey, curve, digest, paramset, x, y, k);
+ if (ret < 0) {
+ gnutls_assert();
+ goto error;
+ }
+
+ ret = gnutls_privkey_import_x509(key, xkey, GNUTLS_PRIVKEY_IMPORT_AUTO_RELEASE);
+ if (ret < 0) {
+ gnutls_assert();
+ goto error;
+ }
+
+ return 0;
+
+error:
+ gnutls_x509_privkey_deinit(xkey);
+ return ret;
+}
diff --git a/lib/pubkey.c b/lib/pubkey.c
index d6d374b786..7c9b6da5f8 100644
--- a/lib/pubkey.c
+++ b/lib/pubkey.c
@@ -61,6 +61,9 @@ unsigned pubkey_to_bits(const gnutls_pk_params_st * params)
return _gnutls_mpi_get_nbits(params->params[DSA_P]);
case GNUTLS_PK_ECDSA:
case GNUTLS_PK_EDDSA_ED25519:
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
return gnutls_ecc_curve_get_size(params->curve) * 8;
default:
return 0;
@@ -313,6 +316,16 @@ gnutls_pubkey_get_preferred_hash_algorithm(gnutls_pubkey_t key,
ret = 0;
break;
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ if (hash)
+ *hash = _gnutls_gost_digest(key->params.algo);
+ if (mand)
+ *mand = 1;
+
+ ret = 0;
+ break;
case GNUTLS_PK_RSA_PSS:
if (mand && key->params.spki.rsa_pss_dig)
*mand = 1;
@@ -959,6 +972,82 @@ int gnutls_pubkey_export_ecc_x962(gnutls_pubkey_t key,
}
/**
+ * gnutls_pubkey_export_gost_raw2:
+ * @key: Holds the public key
+ * @curve: will hold the curve (may be %NULL)
+ * @digest: will hold the curve (may be %NULL)
+ * @paramset: will hold the parameters id (may be %NULL)
+ * @x: will hold x (may be %NULL)
+ * @y: will hold y (may be %NULL)
+ * @flags: flags from %gnutls_abstract_export_flags_t
+ *
+ * This function will export the GOST public key's parameters found in
+ * the given key. The new parameters will be allocated using
+ * gnutls_malloc() and will be stored in the appropriate datum.
+ *
+ * Returns: %GNUTLS_E_SUCCESS on success, otherwise a negative error code.
+ *
+ * Since: 3.6.3
+ **/
+int
+gnutls_pubkey_export_gost_raw2(gnutls_pubkey_t key,
+ gnutls_ecc_curve_t * curve,
+ gnutls_digest_algorithm_t * digest,
+ gnutls_gost_paramset_t * paramset,
+ gnutls_datum_t * x, gnutls_datum_t * y,
+ unsigned int flags)
+{
+ int ret;
+
+ mpi_dprint_func dprint = _gnutls_mpi_dprint_lz;
+
+ if (flags & GNUTLS_EXPORT_FLAG_NO_LZ)
+ dprint = _gnutls_mpi_dprint;
+
+ if (key == NULL) {
+ gnutls_assert();
+ return GNUTLS_E_INVALID_REQUEST;
+ }
+
+ if (key->params.algo != GNUTLS_PK_GOST_01 &&
+ key->params.algo != GNUTLS_PK_GOST_12_256 &&
+ key->params.algo != GNUTLS_PK_GOST_12_512) {
+ gnutls_assert();
+ return GNUTLS_E_INVALID_REQUEST;
+ }
+
+ if (curve)
+ *curve = key->params.curve;
+
+ if (digest)
+ *digest = _gnutls_gost_digest(key->params.algo);
+
+ if (paramset)
+ *paramset = key->params.gost_params;
+
+ /* X */
+ if (x) {
+ ret = dprint(key->params.params[GOST_X], x);
+ if (ret < 0) {
+ gnutls_assert();
+ return ret;
+ }
+ }
+
+ /* Y */
+ if (y) {
+ ret = dprint(key->params.params[GOST_Y], y);
+ if (ret < 0) {
+ gnutls_assert();
+ _gnutls_free_datum(x);
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+/**
* gnutls_pubkey_import:
* @key: The public key.
* @data: The DER or PEM encoded certificate.
@@ -1435,6 +1524,80 @@ gnutls_pubkey_import_ecc_x962(gnutls_pubkey_t key,
}
/**
+ * gnutls_pubkey_import_gost_raw:
+ * @key: The structure to store the parsed key
+ * @curve: holds the curve
+ * @digest: holds the digest
+ * @paramset: holds the parameters id
+ * @x: holds the x
+ * @y: holds the y
+ *
+ * This function will convert the given GOST public key's parameters to a
+ * #gnutls_pubkey_t. The output will be stored in @key.
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise a
+ * negative error value.
+ *
+ * Since: 3.6.3
+ **/
+int
+gnutls_pubkey_import_gost_raw(gnutls_pubkey_t key,
+ gnutls_ecc_curve_t curve,
+ gnutls_digest_algorithm_t digest,
+ gnutls_gost_paramset_t paramset,
+ const gnutls_datum_t * x,
+ const gnutls_datum_t * y)
+{
+ int ret;
+ gnutls_pk_algorithm_t pk_algo;
+
+ if (key == NULL) {
+ gnutls_assert();
+ return GNUTLS_E_INVALID_REQUEST;
+ }
+
+ pk_algo = _gnutls_digest_gost(digest);
+ if (pk_algo == GNUTLS_PK_UNKNOWN)
+ return GNUTLS_E_ILLEGAL_PARAMETER;
+
+ if (paramset < 0) {
+ if (pk_algo == GNUTLS_PK_GOST_01)
+ paramset = GNUTLS_GOST_PARAMSET_CP_A;
+ else
+ paramset = GNUTLS_GOST_PARAMSET_TC26_Z;
+ }
+
+ gnutls_pk_params_release(&key->params);
+ gnutls_pk_params_init(&key->params);
+
+ key->params.curve = curve;
+ key->params.gost_params = paramset;
+
+ if (_gnutls_mpi_init_scan_nz
+ (&key->params.params[GOST_X], x->data, x->size)) {
+ gnutls_assert();
+ ret = GNUTLS_E_MPI_SCAN_FAILED;
+ goto cleanup;
+ }
+ key->params.params_nr++;
+
+ if (_gnutls_mpi_init_scan_nz
+ (&key->params.params[GOST_Y], y->data, y->size)) {
+ gnutls_assert();
+ ret = GNUTLS_E_MPI_SCAN_FAILED;
+ goto cleanup;
+ }
+ key->params.params_nr++;
+ key->params.algo = pk_algo;
+
+ return 0;
+
+ cleanup:
+ gnutls_pk_params_release(&key->params);
+ return ret;
+}
+
+/**
* gnutls_pubkey_import_dsa_raw:
* @key: The structure to store the parsed key
* @p: holds the p
@@ -1993,6 +2156,9 @@ pubkey_verify_hashed_data(const gnutls_sign_entry_st *se,
break;
case GNUTLS_PK_ECDSA:
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
case GNUTLS_PK_DSA:
if (dsa_verify_hashed_data
(se->pk, me, hash, signature, params, sign_params) != 0) {
@@ -2057,6 +2223,9 @@ pubkey_verify_data(const gnutls_sign_entry_st *se,
case GNUTLS_PK_EC:
case GNUTLS_PK_DSA:
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
if (dsa_verify_data
(se->pk, me, data, signature, params, sign_params) != 0) {
gnutls_assert();
diff --git a/lib/x509/common.c b/lib/x509/common.c
index f4310d7e36..c978c024e1 100644
--- a/lib/x509/common.c
+++ b/lib/x509/common.c
@@ -130,6 +130,14 @@ static const struct oid_to_string _oid2str[] = {
/* rfc3920 section 5.1.1 */
ENTRY("1.3.6.1.5.5.7.8.5", "XmppAddr", NULL, ASN1_ETYPE_UTF8_STRING),
+ /* Russian things: https://cdnimg.rg.ru/pril/66/91/91/23041_pril.pdf */
+ /* Main state registration number */
+ ENTRY("1.2.643.100.1", "OGRN", NULL, ASN1_ETYPE_NUMERIC_STRING),
+ /* Individual insurance account number */
+ ENTRY("1.2.643.100.3", "SNILS", NULL, ASN1_ETYPE_NUMERIC_STRING),
+ /* VAT identification number */
+ ENTRY("1.2.643.3.131.1.1", "INN", NULL, ASN1_ETYPE_NUMERIC_STRING),
+
{NULL, 0, NULL, 0, NULL, 0}
};
@@ -1813,3 +1821,90 @@ int _gnutls_check_if_sorted(gnutls_x509_crt_t * crt, int nr)
cleanup:
return ret;
}
+
+/**
+ * gnutls_gost_paramset_get_name:
+ * @param: is a GOST 28147 param set
+ *
+ * Convert a #gnutls_gost_paramset_t value to a string.
+ *
+ * Returns: a string that contains the name of the specified GOST param set,
+ * or %NULL.
+ *
+ * Since: 3.6.3
+ **/
+const char *gnutls_gost_paramset_get_name(gnutls_gost_paramset_t param)
+{
+ switch(param) {
+ case GNUTLS_GOST_PARAMSET_TC26_Z:
+ return "TC26-Z";
+ case GNUTLS_GOST_PARAMSET_CP_A:
+ return "CryptoPro-A";
+ case GNUTLS_GOST_PARAMSET_CP_B:
+ return "CryptoPro-B";
+ case GNUTLS_GOST_PARAMSET_CP_C:
+ return "CryptoPro-C";
+ case GNUTLS_GOST_PARAMSET_CP_D:
+ return "CryptoPro-D";
+ default:
+ gnutls_assert();
+ return "Unknown";
+ }
+}
+
+/**
+ * gnutls_gost_paramset_get_oid:
+ * @param: is a GOST 28147 param set
+ *
+ * Convert a #gnutls_gost_paramset_t value to its object identifier.
+ *
+ * Returns: a string that contains the object identifier of the specified GOST
+ * param set, or %NULL.
+ *
+ * Since: 3.6.3
+ **/
+const char *gnutls_gost_paramset_get_oid(gnutls_gost_paramset_t param)
+{
+ switch(param) {
+ case GNUTLS_GOST_PARAMSET_TC26_Z:
+ return GOST28147_89_TC26Z_OID;
+ case GNUTLS_GOST_PARAMSET_CP_A:
+ return GOST28147_89_CPA_OID;
+ case GNUTLS_GOST_PARAMSET_CP_B:
+ return GOST28147_89_CPB_OID;
+ case GNUTLS_GOST_PARAMSET_CP_C:
+ return GOST28147_89_CPC_OID;
+ case GNUTLS_GOST_PARAMSET_CP_D:
+ return GOST28147_89_CPD_OID;
+ default:
+ gnutls_assert();
+ return NULL;
+ }
+}
+
+/**
+ * gnutls_oid_to_gost_paramset:
+ * @oid: is an object identifier
+ *
+ * Converts a textual object identifier to a #gnutls_gost_paramset_t value.
+ *
+ * Returns: a #gnutls_gost_paramset_get_oid of the specified GOST 28147
+ * param st, or %GNUTLS_GOST_PARAMSET_UNKNOWN on failure.
+ *
+ * Since: 3.6.3
+ **/
+gnutls_gost_paramset_t gnutls_oid_to_gost_paramset(const char *oid)
+{
+ if (!strcmp(oid, GOST28147_89_TC26Z_OID))
+ return GNUTLS_GOST_PARAMSET_TC26_Z;
+ else if (!strcmp(oid, GOST28147_89_CPA_OID))
+ return GNUTLS_GOST_PARAMSET_CP_A;
+ else if (!strcmp(oid, GOST28147_89_CPB_OID))
+ return GNUTLS_GOST_PARAMSET_CP_B;
+ else if (!strcmp(oid, GOST28147_89_CPC_OID))
+ return GNUTLS_GOST_PARAMSET_CP_C;
+ else if (!strcmp(oid, GOST28147_89_CPD_OID))
+ return GNUTLS_GOST_PARAMSET_CP_D;
+ else
+ return gnutls_assert_val(GNUTLS_GOST_PARAMSET_UNKNOWN);
+}
diff --git a/lib/x509/common.h b/lib/x509/common.h
index 1a27666076..637121c2ee 100644
--- a/lib/x509/common.h
+++ b/lib/x509/common.h
@@ -56,6 +56,8 @@
#define PK_DSA_OID "1.2.840.10040.4.1"
#define PK_GOST_R3410_94_OID "1.2.643.2.2.20"
#define PK_GOST_R3410_2001_OID "1.2.643.2.2.19"
+#define PK_GOST_R3410_2012_256_OID "1.2.643.7.1.1.1.1"
+#define PK_GOST_R3410_2012_512_OID "1.2.643.7.1.1.1.2"
/* signature OIDs
*/
@@ -76,6 +78,8 @@
#define SIG_RSA_RMD160_OID "1.3.36.3.3.1.2"
#define SIG_GOST_R3410_94_OID "1.2.643.2.2.4"
#define SIG_GOST_R3410_2001_OID "1.2.643.2.2.3"
+#define SIG_GOST_R3410_2012_256_OID "1.2.643.7.1.1.3.2"
+#define SIG_GOST_R3410_2012_512_OID "1.2.643.7.1.1.3.3"
#define ISO_SIG_RSA_SHA1_OID "1.3.14.3.2.29"
#define SIG_DSA_SHA3_224_OID "2.16.840.1.101.3.4.3.5"
@@ -99,6 +103,13 @@
#define KRB5_PRINCIPAL_OID "1.3.6.1.5.2.2"
#define PKIX1_RSA_PSS_MGF1_OID "1.2.840.113549.1.1.8"
+#define GOST28147_89_OID "1.2.643.2.2.21"
+#define GOST28147_89_TC26Z_OID "1.2.643.7.1.2.5.1.1"
+#define GOST28147_89_CPA_OID "1.2.643.2.2.31.1"
+#define GOST28147_89_CPB_OID "1.2.643.2.2.31.2"
+#define GOST28147_89_CPC_OID "1.2.643.2.2.31.3"
+#define GOST28147_89_CPD_OID "1.2.643.2.2.31.4"
+
#define ASN1_NULL "\x05\x00"
#define ASN1_NULL_SIZE 2
diff --git a/lib/x509/key_decode.c b/lib/x509/key_decode.c
index a1bf82688a..b1df8aaab3 100644
--- a/lib/x509/key_decode.c
+++ b/lib/x509/key_decode.c
@@ -39,6 +39,8 @@ static int _gnutls_x509_read_ecc_pubkey(uint8_t * der, int dersize,
gnutls_pk_params_st * params);
static int _gnutls_x509_read_eddsa_pubkey(uint8_t * der, int dersize,
gnutls_pk_params_st * params);
+static int _gnutls_x509_read_gost_pubkey(uint8_t * der, int dersize,
+ gnutls_pk_params_st * params);
static int
_gnutls_x509_read_dsa_params(uint8_t * der, int dersize,
@@ -117,6 +119,47 @@ int _gnutls_x509_read_eddsa_pubkey(uint8_t * der, int dersize,
return _gnutls_set_datum(&params->raw_pub, der, dersize);
}
+/* Pubkey is a concatenation of X (in little endian) and Y (also LE)
+ * encoded into OCTET STRING. */
+static int
+_gnutls_x509_read_gost_pubkey(uint8_t * der, int dersize,
+ gnutls_pk_params_st * params)
+{
+ int ret;
+ int len;
+ bigint_t *x = &params->params[GOST_X];
+ bigint_t *y = &params->params[GOST_Y];
+
+ /* Quick and dirty parsing of OCTET STRING of 0x40 or 0x80 bytes */
+ if (dersize < 1 || der[0] != ASN1_TAG_OCTET_STRING) {
+ return gnutls_assert_val(GNUTLS_E_PARSING_ERROR);
+ }
+
+ der++;
+ dersize--;
+
+ ret = asn1_get_length_der(der, dersize, &len);
+ if (ret <= 0 || ret % 2 != 0 || dersize != len + ret) {
+ return gnutls_assert_val(GNUTLS_E_PARSING_ERROR);
+ }
+
+ der += len;
+ dersize -= len;
+
+ /* read data */
+ ret = _gnutls_mpi_init_scan_le(x, der, dersize / 2);
+ if (ret < 0)
+ return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
+
+ ret = _gnutls_mpi_init_scan_le(y, der + dersize / 2, dersize / 2);
+ if (ret < 0) {
+ _gnutls_mpi_release(y);
+ return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
+ }
+
+ return 0;
+}
+
/* reads p,q and g
* from the certificate (subjectPublicKey BIT STRING).
* params[0-2]. It does NOT set params_nr.
@@ -387,6 +430,97 @@ _gnutls_x509_read_rsa_pss_params(uint8_t * der, int dersize,
return result;
}
+/* reads the curve from the certificate.
+ * It does NOT set params_nr.
+ */
+int
+_gnutls_x509_read_gost_params(uint8_t * der, int dersize,
+ gnutls_pk_params_st * params)
+{
+ int ret;
+ ASN1_TYPE spk = ASN1_TYPE_EMPTY;
+ char oid[MAX_OID_SIZE];
+ int oid_size;
+ gnutls_ecc_curve_t curve;
+ int param;
+
+ if ((ret = asn1_create_element(_gnutls_get_gnutls_asn(),
+ "GNUTLS.GOSTParameters",
+ &spk)) != ASN1_SUCCESS) {
+ gnutls_assert();
+ return _gnutls_asn2err(ret);
+ }
+
+ ret = _asn1_strict_der_decode(&spk, der, dersize, NULL);
+
+ if (ret != ASN1_SUCCESS) {
+ gnutls_assert();
+ ret = _gnutls_asn2err(ret);
+ goto cleanup;
+ }
+
+ /* read the curve */
+ oid_size = sizeof(oid);
+ ret = asn1_read_value(spk, "publicKeyParamSet", oid, &oid_size);
+ if (ret != ASN1_SUCCESS) {
+ gnutls_assert();
+ ret = _gnutls_asn2err(ret);
+ goto cleanup;
+ }
+
+ curve = gnutls_oid_to_ecc_curve(oid);
+ if (curve == GNUTLS_ECC_CURVE_INVALID) {
+ _gnutls_debug_log("Curve %s is not supported\n", oid);
+ gnutls_assert();
+ ret = GNUTLS_E_ECC_UNSUPPORTED_CURVE;
+ goto cleanup;
+ }
+
+ /* Read the digest */
+ oid_size = sizeof(oid);
+ ret = asn1_read_value(spk, "digestParamSet", oid, &oid_size);
+ if (ret != ASN1_SUCCESS) {
+ gnutls_assert();
+ ret = _gnutls_asn2err(ret);
+ goto cleanup;
+ }
+ /* For now ignore the OID: we use pk OID instead */
+
+ if (!strcmp(oid, HASH_OID_GOST_R_3411_94_CRYPTOPRO_PARAMS))
+ param = GNUTLS_GOST_PARAMSET_CP_A;
+ else
+ param = GNUTLS_GOST_PARAMSET_TC26_Z;
+
+ oid_size = sizeof(oid);
+ ret = asn1_read_value(spk, "encryptionParamSet", oid, &oid_size);
+ if (ret != ASN1_SUCCESS &&
+ ret != ASN1_ELEMENT_NOT_FOUND) {
+ gnutls_assert();
+ ret = _gnutls_asn2err(ret);
+ goto cleanup;
+ }
+
+ if (ret != ASN1_ELEMENT_NOT_FOUND)
+ param = gnutls_oid_to_gost_paramset(oid);
+
+ if (param < 0) {
+ gnutls_assert();
+ ret = param;
+ goto cleanup;
+ }
+
+ params->curve = curve;
+ params->gost_params = param;
+ ret = 0;
+
+ cleanup:
+
+ asn1_delete_structure(&spk);
+
+ return ret;
+
+}
+
/* This function must be called after _gnutls_x509_read_params()
*/
int _gnutls_x509_read_pubkey(gnutls_pk_algorithm_t algo, uint8_t * der,
@@ -423,6 +557,15 @@ int _gnutls_x509_read_pubkey(gnutls_pk_algorithm_t algo, uint8_t * der,
case GNUTLS_PK_EDDSA_ED25519:
ret = _gnutls_x509_read_eddsa_pubkey(der, dersize, params);
break;
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ ret = _gnutls_x509_read_gost_pubkey(der, dersize, params);
+ if (ret >= 0) {
+ params->algo = algo;
+ params->params_nr = GOST_PUBLIC_PARAMS;
+ }
+ break;
default:
ret = gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
break;
@@ -446,6 +589,10 @@ int _gnutls_x509_read_pubkey_params(gnutls_pk_algorithm_t algo,
return _gnutls_x509_read_dsa_params(der, dersize, params);
case GNUTLS_PK_EC:
return _gnutls_x509_read_ecc_params(der, dersize, &params->curve);
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ return _gnutls_x509_read_gost_params(der, dersize, params);
default:
return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
}
@@ -479,6 +626,9 @@ int _gnutls_x509_check_pubkey_params(gnutls_pk_params_st * params)
case GNUTLS_PK_DSA:
case GNUTLS_PK_ECDSA:
case GNUTLS_PK_EDDSA_ED25519:
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
return 0;
default:
return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
diff --git a/lib/x509/key_encode.c b/lib/x509/key_encode.c
index 0f12975d18..6cd42f2c0f 100644
--- a/lib/x509/key_encode.c
+++ b/lib/x509/key_encode.c
@@ -39,6 +39,10 @@ static int _gnutls_x509_write_dsa_params(gnutls_pk_params_st * params,
gnutls_datum_t * der);
static int _gnutls_x509_write_dsa_pubkey(gnutls_pk_params_st * params,
gnutls_datum_t * der);
+static int _gnutls_x509_write_gost_params(gnutls_pk_params_st * params,
+ gnutls_datum_t * der);
+static int _gnutls_x509_write_gost_pubkey(gnutls_pk_params_st * params,
+ gnutls_datum_t * der);
/*
* some x509 certificate functions that relate to MPI parameter
@@ -157,6 +161,78 @@ _gnutls_x509_write_eddsa_pubkey(gnutls_pk_params_st * params,
}
int
+_gnutls_x509_write_gost_pubkey(gnutls_pk_params_st * params,
+ gnutls_datum_t * der)
+{
+ bigint_t x, y;
+ int numlen;
+ int byte_size, ret;
+ size_t size;
+ int pos;
+
+ der->data = NULL;
+ der->size = 0;
+
+ if (params->params_nr < GOST_PUBLIC_PARAMS)
+ return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+
+ x = params->params[GOST_X];
+ y = params->params[GOST_Y];
+ numlen = gnutls_ecc_curve_get_size(params->curve);
+
+ if (numlen == 0)
+ return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+
+ der->size = 1 + ASN1_MAX_LENGTH_SIZE + 2 * numlen;
+
+ der->data = gnutls_malloc(der->size);
+ if (der->data == NULL)
+ return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
+
+ memset(der->data, 0, der->size);
+
+ der->data[0] = ASN1_TAG_OCTET_STRING;
+ asn1_length_der(2 * numlen, &der->data[1], &pos);
+ pos += 1;
+
+ /* pad and store x */
+ byte_size = (_gnutls_mpi_get_nbits(x) + 7) / 8;
+ if (numlen < byte_size) {
+ ret = gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+ goto cleanup;
+ }
+
+ size = numlen;
+ ret = _gnutls_mpi_print_le(x, &der->data[pos], &size);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+
+ /* pad and store y */
+ byte_size = (_gnutls_mpi_get_nbits(y) + 7) / 8;
+ if (numlen < byte_size) {
+ ret = gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+ goto cleanup;
+ }
+
+ size = numlen;
+ ret = _gnutls_mpi_print_le(y, &der->data[pos + numlen], &size);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+
+ der->size = pos + 2 * numlen;
+
+ return 0;
+
+ cleanup:
+ _gnutls_free_datum(der);
+ return ret;
+}
+
+int
_gnutls_x509_write_pubkey_params(gnutls_pk_params_st * params,
gnutls_datum_t * der)
{
@@ -180,6 +256,10 @@ _gnutls_x509_write_pubkey_params(gnutls_pk_params_st * params,
der->size = 0;
return 0;
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ return _gnutls_x509_write_gost_params(params, der);
default:
return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
}
@@ -199,6 +279,10 @@ _gnutls_x509_write_pubkey(gnutls_pk_params_st * params,
return _gnutls_x509_write_ecc_pubkey(params, der);
case GNUTLS_PK_EDDSA_ED25519:
return _gnutls_x509_write_eddsa_pubkey(params, der);
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ return _gnutls_x509_write_gost_pubkey(params, der);
default:
return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
}
@@ -439,6 +523,93 @@ _gnutls_x509_write_rsa_pss_params(gnutls_x509_spki_st *params,
return result;
}
+static int
+_gnutls_x509_write_gost_params(gnutls_pk_params_st * params,
+ gnutls_datum_t * der)
+{
+ int result;
+ ASN1_TYPE spk = ASN1_TYPE_EMPTY;
+ const char *oid;
+
+ der->data = NULL;
+ der->size = 0;
+
+ oid = gnutls_ecc_curve_get_oid(params->curve);
+ if (oid == NULL)
+ return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+
+
+ if ((result = asn1_create_element
+ (_gnutls_get_gnutls_asn(), "GNUTLS.GOSTParameters", &spk))
+ != ASN1_SUCCESS) {
+ gnutls_assert();
+ return _gnutls_asn2err(result);
+ }
+
+ if ((result =
+ asn1_write_value(spk, "publicKeyParamSet", oid,
+ 1)) != ASN1_SUCCESS) {
+ gnutls_assert();
+ result = _gnutls_asn2err(result);
+ goto cleanup;
+ }
+
+ if (params->algo == GNUTLS_PK_GOST_01)
+ oid = HASH_OID_GOST_R_3411_94_CRYPTOPRO_PARAMS;
+ else if (params->algo == GNUTLS_PK_GOST_12_256)
+ oid = HASH_OID_STREEBOG_256;
+ else if (params->algo == GNUTLS_PK_GOST_12_512)
+ oid = HASH_OID_STREEBOG_512;
+ else {
+ gnutls_assert();
+ result = GNUTLS_E_INVALID_REQUEST;
+ goto cleanup;
+ }
+
+ if ((result =
+ asn1_write_value(spk, "digestParamSet", oid,
+ 1)) != ASN1_SUCCESS) {
+ gnutls_assert();
+ result = _gnutls_asn2err(result);
+ goto cleanup;
+ }
+
+ oid = gnutls_gost_paramset_get_oid(params->gost_params);
+ if (oid == NULL) {
+ gnutls_assert();
+ result = GNUTLS_E_INVALID_REQUEST;
+ goto cleanup;
+ }
+
+ if (params->algo == GNUTLS_PK_GOST_01) {
+ if (params->gost_params == GNUTLS_GOST_PARAMSET_CP_A)
+ oid = NULL;
+ } else {
+ if (params->gost_params == GNUTLS_GOST_PARAMSET_TC26_Z)
+ oid = NULL;
+ }
+
+ if ((result =
+ asn1_write_value(spk, "encryptionParamSet", oid,
+ oid ? 1 : 0)) != ASN1_SUCCESS) {
+ gnutls_assert();
+ result = _gnutls_asn2err(result);
+ goto cleanup;
+ }
+
+ result = _gnutls_x509_der_encode(spk, "", der, 0);
+ if (result < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+
+ result = 0;
+
+ cleanup:
+ asn1_delete_structure(&spk);
+ return result;
+}
+
/*
* This function writes the public parameters for DSS keys.
* Needs 1 parameter (y).
@@ -729,6 +900,46 @@ cleanup:
return ret;
}
+static int
+_gnutls_asn1_encode_gost(ASN1_TYPE * c2, gnutls_pk_params_st * params)
+{
+ int ret;
+ const char *oid;
+
+ oid = gnutls_pk_get_oid(params->algo);
+
+ if (params->params_nr != GOST_PRIVATE_PARAMS || oid == NULL)
+ return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+
+ /* first make sure that no previously allocated data are leaked */
+ if (*c2 != ASN1_TYPE_EMPTY) {
+ asn1_delete_structure(c2);
+ *c2 = ASN1_TYPE_EMPTY;
+ }
+
+ if ((ret = asn1_create_element
+ (_gnutls_get_gnutls_asn(), "GNUTLS.GOSTPrivateKey", c2))
+ != ASN1_SUCCESS) {
+ gnutls_assert();
+ ret = _gnutls_asn2err(ret);
+ goto cleanup;
+ }
+
+ ret =
+ _gnutls_x509_write_key_int_le(*c2, "", params->params[GOST_K]);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+
+
+ return 0;
+
+cleanup:
+ asn1_delete_structure2(c2, ASN1_DELETE_FLAG_ZEROIZE);
+
+ return ret;
+}
/* Encodes the DSA parameters into an ASN.1 DSAPrivateKey structure.
*/
@@ -820,6 +1031,10 @@ int _gnutls_asn1_encode_privkey(ASN1_TYPE * c2,
case GNUTLS_PK_ECDSA:
case GNUTLS_PK_EDDSA_ED25519:
return _gnutls_asn1_encode_ecc(c2, params);
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ return _gnutls_asn1_encode_gost(c2, params);
default:
return GNUTLS_E_UNIMPLEMENTED_FEATURE;
}
diff --git a/lib/x509/output.c b/lib/x509/output.c
index b9e183d37f..4fc37d6253 100644
--- a/lib/x509/output.c
+++ b/lib/x509/output.c
@@ -1404,6 +1404,60 @@ print_pubkey(gnutls_buffer_st * str, const char *key_name,
}
break;
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ {
+ gnutls_datum_t x, y;
+ gnutls_ecc_curve_t curve;
+ gnutls_digest_algorithm_t digest;
+ gnutls_gost_paramset_t param;
+
+ err =
+ gnutls_pubkey_export_gost_raw2(pubkey, &curve,
+ &digest,
+ &param,
+ &x, &y, 0);
+ if (err < 0)
+ addf(str, "error: get_pk_gost_raw: %s\n",
+ gnutls_strerror(err));
+ else {
+ addf(str, _("\t\tCurve:\t%s\n"),
+ gnutls_ecc_curve_get_name(curve));
+ addf(str, _("\t\tDigest:\t%s\n"),
+ gnutls_digest_get_name(digest));
+ addf(str, _("\t\tParamSet: %s\n"),
+ gnutls_gost_paramset_get_name(param));
+ if (format ==
+ GNUTLS_CRT_PRINT_FULL_NUMBERS) {
+ adds(str, _("\t\tX: "));
+ _gnutls_buffer_hexprint(str,
+ x.data,
+ x.size);
+ adds(str, "\n");
+ adds(str, _("\t\tY: "));
+ _gnutls_buffer_hexprint(str,
+ y.data,
+ y.size);
+ adds(str, "\n");
+ } else {
+ adds(str, _("\t\tX:\n"));
+ _gnutls_buffer_hexdump(str, x.data,
+ x.size,
+ "\t\t\t");
+ adds(str, _("\t\tY:\n"));
+ _gnutls_buffer_hexdump(str, y.data,
+ y.size,
+ "\t\t\t");
+ }
+
+ gnutls_free(x.data);
+ gnutls_free(y.data);
+
+ }
+ }
+ break;
+
default:
break;
}
@@ -1770,6 +1824,15 @@ static void print_keyid(gnutls_buffer_st * str, gnutls_x509_crt_t cert)
name = gnutls_ecc_curve_get_name(curve);
bits = 0;
+ } else if (IS_GOSTEC(err)) {
+ gnutls_ecc_curve_t curve;
+
+ err = gnutls_x509_crt_get_pk_gost_raw(cert, &curve, NULL, NULL, NULL, NULL);
+ if (err < 0)
+ return;
+
+ name = gnutls_ecc_curve_get_name(curve);
+ bits = 0;
} else {
name = gnutls_pk_get_name(err);
}
diff --git a/lib/x509/pkcs12.c b/lib/x509/pkcs12.c
index 2b7b8d6402..7164820a8d 100644
--- a/lib/x509/pkcs12.c
+++ b/lib/x509/pkcs12.c
@@ -37,6 +37,10 @@
#include "x509_int.h"
#include "pkcs7_int.h"
#include <random.h>
+#include <nettle/pbkdf2.h>
+#if ENABLE_GOST
+#include "../nettle/gost/pbkdf2-gost.h"
+#endif
/* Decodes the PKCS #12 auth_safe, and returns the allocated raw data,
@@ -843,6 +847,53 @@ int gnutls_pkcs12_set_bag(gnutls_pkcs12_t pkcs12, gnutls_pkcs12_bag_t bag)
return result;
}
+#if ENABLE_GOST
+/*
+ * Russian differs from PKCS#12 here. It described proprietary way
+ * to obtain MAC key instead of using standard mechanism.
+ *
+ * See http://wwwold.tc26.ru/standard/rs/%D0%A0%2050.1.112-2016.pdf
+ * section 5.
+ */
+static int
+_gnutls_pkcs12_gost_string_to_key(gnutls_mac_algorithm_t algo,
+ const uint8_t * salt,
+ unsigned int salt_size, unsigned int iter,
+ const char *pass, unsigned int req_keylen,
+ uint8_t * keybuf)
+{
+ uint8_t temp[96];
+ size_t temp_len = sizeof(temp);
+ unsigned int pass_len = 0;
+
+ if (pass)
+ pass_len = strlen(pass);
+
+ if (algo == GNUTLS_MAC_GOSTR_94)
+ pbkdf2_hmac_gosthash94cp(pass_len, (uint8_t *) pass,
+ iter,
+ salt_size,
+ salt, temp_len, temp);
+ else if (algo == GNUTLS_MAC_STREEBOG_256)
+ pbkdf2_hmac_streebog256(pass_len, (uint8_t *) pass,
+ iter,
+ salt_size,
+ salt, temp_len, temp);
+ else if (algo == GNUTLS_MAC_STREEBOG_512)
+ pbkdf2_hmac_streebog512(pass_len, (uint8_t *) pass,
+ iter,
+ salt_size,
+ salt, temp_len, temp);
+ else
+ /* Should not reach here */
+ return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+
+ memcpy(keybuf, temp + temp_len - req_keylen, req_keylen);
+
+ return 0;
+}
+#endif
+
/**
* gnutls_pkcs12_generate_mac2:
* @pkcs12: A pkcs12 type
@@ -861,7 +912,7 @@ int gnutls_pkcs12_generate_mac2(gnutls_pkcs12_t pkcs12, gnutls_mac_algorithm_t m
const int iter = 10*1024;
mac_hd_st td1;
gnutls_datum_t tmp = { NULL, 0 };
- unsigned mac_size;
+ unsigned mac_size, key_len;
uint8_t mac_out[MAX_HASH_SIZE];
const mac_entry_st *me = mac_to_entry(mac);
@@ -872,6 +923,7 @@ int gnutls_pkcs12_generate_mac2(gnutls_pkcs12_t pkcs12, gnutls_mac_algorithm_t m
return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
mac_size = _gnutls_mac_get_algo_len(me);
+ key_len = mac_size;
/* Generate the salt.
*/
@@ -907,9 +959,24 @@ int gnutls_pkcs12_generate_mac2(gnutls_pkcs12_t pkcs12, gnutls_mac_algorithm_t m
/* Generate the key.
*/
- result =
- _gnutls_pkcs12_string_to_key(me, 3 /*MAC*/, salt, sizeof(salt),
- iter, pass, mac_size, key);
+#if ENABLE_GOST
+ if (me->id == GNUTLS_MAC_GOSTR_94 ||
+ me->id == GNUTLS_MAC_STREEBOG_256 ||
+ me->id == GNUTLS_MAC_STREEBOG_512) {
+ key_len = 32;
+ result = _gnutls_pkcs12_gost_string_to_key(me->id,
+ salt,
+ sizeof(salt),
+ iter,
+ pass,
+ mac_size,
+ key);
+ } else
+#endif
+ result = _gnutls_pkcs12_string_to_key(me, 3 /*MAC*/,
+ salt, sizeof(salt),
+ iter, pass,
+ mac_size, key);
if (result < 0) {
gnutls_assert();
goto cleanup;
@@ -926,7 +993,7 @@ int gnutls_pkcs12_generate_mac2(gnutls_pkcs12_t pkcs12, gnutls_mac_algorithm_t m
/* MAC the data
*/
result = _gnutls_mac_init(&td1, me,
- key, mac_size);
+ key, key_len);
if (result < 0) {
gnutls_assert();
goto cleanup;
@@ -1014,6 +1081,9 @@ int gnutls_pkcs12_verify_mac(gnutls_pkcs12_t pkcs12, const char *pass)
gnutls_mac_algorithm_t algo;
unsigned mac_len, key_len;
const mac_entry_st *entry;
+#if ENABLE_GOST
+ int gost_retry = 0;
+#endif
if (pkcs12 == NULL) {
gnutls_assert();
@@ -1064,16 +1134,15 @@ int gnutls_pkcs12_verify_mac(gnutls_pkcs12_t pkcs12, const char *pass)
/* Generate the key.
*/
- result =
- _gnutls_pkcs12_string_to_key(entry, 3 /*MAC*/, salt.data, salt.size,
- iter, pass, key_len, key);
+ result = _gnutls_pkcs12_string_to_key(entry, 3 /*MAC*/,
+ salt.data, salt.size,
+ iter, pass,
+ key_len, key);
if (result < 0) {
gnutls_assert();
goto cleanup;
}
- _gnutls_free_datum(&salt);
-
/* Get the data to be MACed
*/
result = _decode_pkcs12_auth_safe(pkcs12->pkcs12, NULL, &tmp);
@@ -1082,6 +1151,12 @@ int gnutls_pkcs12_verify_mac(gnutls_pkcs12_t pkcs12, const char *pass)
goto cleanup;
}
+#if ENABLE_GOST
+ /* GOST PKCS#12 files use either PKCS#12 scheme or proprietary
+ * HMAC-based scheme to generate MAC key. */
+pkcs12_try_gost:
+#endif
+
/* MAC the data
*/
result = _gnutls_mac_init(&td1, entry, key, key_len);
@@ -1091,7 +1166,6 @@ int gnutls_pkcs12_verify_mac(gnutls_pkcs12_t pkcs12, const char *pass)
}
_gnutls_mac(&td1, tmp.data, tmp.size);
- _gnutls_free_datum(&tmp);
_gnutls_mac_deinit(&td1, mac_output);
@@ -1107,10 +1181,40 @@ int gnutls_pkcs12_verify_mac(gnutls_pkcs12_t pkcs12, const char *pass)
if ((unsigned)len != mac_len ||
memcmp(mac_output_orig, mac_output, len) != 0) {
+
+#if ENABLE_GOST
+ /* It is possible that GOST files use proprietary
+ * key generation scheme */
+ if (!gost_retry &&
+ (algo == GNUTLS_MAC_GOSTR_94 ||
+ algo == GNUTLS_MAC_STREEBOG_256 ||
+ algo == GNUTLS_MAC_STREEBOG_512)) {
+ gost_retry = 1;
+ key_len = 32;
+ result = _gnutls_pkcs12_gost_string_to_key(algo,
+ salt.data,
+ salt.size,
+ iter,
+ pass,
+ key_len,
+ key);
+ if (result < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+
+ goto pkcs12_try_gost;
+ }
+#endif
+
gnutls_assert();
- return GNUTLS_E_MAC_VERIFY_FAILED;
+ result = GNUTLS_E_MAC_VERIFY_FAILED;
+ goto cleanup;
}
+ _gnutls_free_datum(&tmp);
+ _gnutls_free_datum(&salt);
+
return 0;
cleanup:
diff --git a/lib/x509/pkcs12_encr.c b/lib/x509/pkcs12_encr.c
index 5faf75f69c..9d9c1d64a9 100644
--- a/lib/x509/pkcs12_encr.c
+++ b/lib/x509/pkcs12_encr.c
@@ -61,9 +61,14 @@ _gnutls_pkcs12_string_to_key(const mac_entry_st * me,
unsigned v_size = 0;
switch (me->id) {
+ case GNUTLS_DIG_GOSTR_94:
+ v_size = 32;
+ break;
case GNUTLS_DIG_SHA1:
case GNUTLS_DIG_SHA224:
case GNUTLS_DIG_SHA256:
+ case GNUTLS_DIG_STREEBOG_256:
+ case GNUTLS_DIG_STREEBOG_512:
v_size = 64;
break;
case GNUTLS_DIG_SHA384:
diff --git a/lib/x509/pkcs7-crypt.c b/lib/x509/pkcs7-crypt.c
index 1f6298d36c..c2b00e61c1 100644
--- a/lib/x509/pkcs7-crypt.c
+++ b/lib/x509/pkcs7-crypt.c
@@ -37,6 +37,9 @@
#include <random.h>
#include <pk.h>
#include <nettle/pbkdf2.h>
+#if ENABLE_GOST
+#include "../nettle/gost/pbkdf2-gost.h"
+#endif
#define PBES1_DES_MD5_OID "1.2.840.113549.1.5.3"
@@ -63,6 +66,7 @@ static const struct pkcs_cipher_schema_st avail_pkcs_cipher_schemas[] = {
.cipher_oid = PBES1_DES_MD5_OID,
.write_oid = PBES1_DES_MD5_OID,
.desc = NULL,
+ .iv_name = NULL,
.decrypt_only = 1},
{
.schema = PBES2_3DES,
@@ -73,6 +77,7 @@ static const struct pkcs_cipher_schema_st avail_pkcs_cipher_schemas[] = {
.cipher_oid = DES_EDE3_CBC_OID,
.write_oid = PBES2_OID,
.desc = "PKIX1.pkcs-5-des-EDE3-CBC-params",
+ .iv_name = "",
.decrypt_only = 0},
{
.schema = PBES2_DES,
@@ -83,6 +88,7 @@ static const struct pkcs_cipher_schema_st avail_pkcs_cipher_schemas[] = {
.cipher_oid = DES_CBC_OID,
.write_oid = PBES2_OID,
.desc = "PKIX1.pkcs-5-des-CBC-params",
+ .iv_name = "",
.decrypt_only = 0},
{
.schema = PBES2_AES_128,
@@ -93,6 +99,7 @@ static const struct pkcs_cipher_schema_st avail_pkcs_cipher_schemas[] = {
.cipher_oid = AES_128_CBC_OID,
.write_oid = PBES2_OID,
.desc = "PKIX1.pkcs-5-aes128-CBC-params",
+ .iv_name = "",
.decrypt_only = 0},
{
.schema = PBES2_AES_192,
@@ -103,6 +110,7 @@ static const struct pkcs_cipher_schema_st avail_pkcs_cipher_schemas[] = {
.cipher_oid = AES_192_CBC_OID,
.write_oid = PBES2_OID,
.desc = "PKIX1.pkcs-5-aes192-CBC-params",
+ .iv_name = "",
.decrypt_only = 0},
{
.schema = PBES2_AES_256,
@@ -113,6 +121,62 @@ static const struct pkcs_cipher_schema_st avail_pkcs_cipher_schemas[] = {
.cipher_oid = AES_256_CBC_OID,
.write_oid = PBES2_OID,
.desc = "PKIX1.pkcs-5-aes256-CBC-params",
+ .iv_name = "",
+ .decrypt_only = 0},
+ {
+ .schema = PBES2_GOST28147_89_TC26Z,
+ .name = "PBES2-GOST28147-89-TC26Z",
+ .flag = GNUTLS_PKCS_PBES2_GOST_TC26Z,
+ .cipher = GNUTLS_CIPHER_GOST28147_TC26Z_CFB,
+ .pbes2 = 1,
+ .cipher_oid = GOST28147_89_TC26Z_OID,
+ .write_oid = PBES2_OID,
+ .desc = "PKIX1.Gost28147-89-Parameters",
+ .iv_name = "iv",
+ .decrypt_only = 0},
+ {
+ .schema = PBES2_GOST28147_89_CPA,
+ .name = "PBES2-GOST28147-89-CPA",
+ .flag = GNUTLS_PKCS_PBES2_GOST_CPA,
+ .cipher = GNUTLS_CIPHER_GOST28147_CPA_CFB,
+ .pbes2 = 1,
+ .cipher_oid = GOST28147_89_CPA_OID,
+ .write_oid = PBES2_OID,
+ .desc = "PKIX1.Gost28147-89-Parameters",
+ .iv_name = "iv",
+ .decrypt_only = 0},
+ {
+ .schema = PBES2_GOST28147_89_CPB,
+ .name = "PBES2-GOST28147-89-CPB",
+ .flag = GNUTLS_PKCS_PBES2_GOST_CPB,
+ .cipher = GNUTLS_CIPHER_GOST28147_CPB_CFB,
+ .pbes2 = 1,
+ .cipher_oid = GOST28147_89_CPB_OID,
+ .write_oid = PBES2_OID,
+ .desc = "PKIX1.Gost28147-89-Parameters",
+ .iv_name = "iv",
+ .decrypt_only = 0},
+ {
+ .schema = PBES2_GOST28147_89_CPC,
+ .name = "PBES2-GOST28147-89-CPC",
+ .flag = GNUTLS_PKCS_PBES2_GOST_CPC,
+ .cipher = GNUTLS_CIPHER_GOST28147_CPC_CFB,
+ .pbes2 = 1,
+ .cipher_oid = GOST28147_89_CPC_OID,
+ .write_oid = PBES2_OID,
+ .desc = "PKIX1.Gost28147-89-Parameters",
+ .iv_name = "iv",
+ .decrypt_only = 0},
+ {
+ .schema = PBES2_GOST28147_89_CPD,
+ .name = "PBES2-GOST28147-89-CPD",
+ .flag = GNUTLS_PKCS_PBES2_GOST_CPD,
+ .cipher = GNUTLS_CIPHER_GOST28147_CPD_CFB,
+ .pbes2 = 1,
+ .cipher_oid = GOST28147_89_CPD_OID,
+ .write_oid = PBES2_OID,
+ .desc = "PKIX1.Gost28147-89-Parameters",
+ .iv_name = "iv",
.decrypt_only = 0},
{
.schema = PKCS12_ARCFOUR_SHA1,
@@ -123,6 +187,7 @@ static const struct pkcs_cipher_schema_st avail_pkcs_cipher_schemas[] = {
.cipher_oid = PKCS12_PBE_ARCFOUR_SHA1_OID,
.write_oid = PKCS12_PBE_ARCFOUR_SHA1_OID,
.desc = NULL,
+ .iv_name = NULL,
.decrypt_only = 0},
{
.schema = PKCS12_RC2_40_SHA1,
@@ -133,6 +198,7 @@ static const struct pkcs_cipher_schema_st avail_pkcs_cipher_schemas[] = {
.cipher_oid = PKCS12_PBE_RC2_40_SHA1_OID,
.write_oid = PKCS12_PBE_RC2_40_SHA1_OID,
.desc = NULL,
+ .iv_name = NULL,
.decrypt_only = 0},
{
.schema = PKCS12_3DES_SHA1,
@@ -143,6 +209,7 @@ static const struct pkcs_cipher_schema_st avail_pkcs_cipher_schemas[] = {
.cipher_oid = PKCS12_PBE_3DES_SHA1_OID,
.write_oid = PKCS12_PBE_3DES_SHA1_OID,
.desc = NULL,
+ .iv_name = NULL,
.decrypt_only = 0},
{0, 0, 0, 0, 0}
};
@@ -785,6 +852,42 @@ write_pkcs12_kdf_params(ASN1_TYPE pasn, const struct pbkdf2_params *kdf_params)
}
static int
+read_pbes2_gost_oid(uint8_t *der, size_t len, char *oid, int oid_size)
+{
+ int result;
+ ASN1_TYPE pbe_asn = ASN1_TYPE_EMPTY;
+
+ if ((result =
+ asn1_create_element(_gnutls_get_pkix(),
+ "PKIX1.Gost28147-89-Parameters", &pbe_asn)) != ASN1_SUCCESS) {
+ gnutls_assert();
+ return _gnutls_asn2err(result);
+ }
+
+ result =
+ _asn1_strict_der_decode(&pbe_asn, der, len, NULL);
+ if (result != ASN1_SUCCESS) {
+ gnutls_assert();
+ result = _gnutls_asn2err(result);
+ goto error;
+ }
+
+ result = asn1_read_value(pbe_asn, "encryptionParamSet",
+ oid, &oid_size);
+ if (result != ASN1_SUCCESS) {
+ gnutls_assert();
+ result = _gnutls_asn2err(result);
+ goto error;
+ }
+
+ result = 0;
+
+ error:
+ asn1_delete_structure(&pbe_asn);
+ return result;
+}
+
+static int
read_pbes2_enc_params(ASN1_TYPE pasn,
const gnutls_datum_t * der, struct pbe_enc_params *params)
{
@@ -805,11 +908,6 @@ read_pbes2_enc_params(ASN1_TYPE pasn,
}
_gnutls_hard_log("encryptionScheme.algorithm: %s\n", params->pbes2_oid);
- if ((result = pbes2_cipher_oid_to_algo(params->pbes2_oid, &params->cipher)) < 0) {
- gnutls_assert();
- return result;
- }
-
result =
asn1_der_decoding_startEnd(pasn, der->data, der->size,
"encryptionScheme.parameters",
@@ -820,6 +918,22 @@ read_pbes2_enc_params(ASN1_TYPE pasn,
}
params_len = params_end - params_start + 1;
+ /* For GOST we have to read params to determine actual cipher */
+ if (!strcmp(params->pbes2_oid, GOST28147_89_OID)) {
+ len = sizeof(params->pbes2_oid);
+ result = read_pbes2_gost_oid(&der->data[params_start],
+ params_len, params->pbes2_oid, len);
+ if (result < 0) {
+ gnutls_assert();
+ return result;
+ }
+ }
+
+ if ((result = pbes2_cipher_oid_to_algo(params->pbes2_oid, &params->cipher)) < 0) {
+ gnutls_assert();
+ return result;
+ }
+
/* Now check the encryption parameters.
*/
p = algo_to_pbes2_cipher_schema(params->cipher);
@@ -846,7 +960,9 @@ read_pbes2_enc_params(ASN1_TYPE pasn,
/* read the IV */
params->iv_size = sizeof(params->iv);
- result = asn1_read_value(pbe_asn, "", params->iv, &params->iv_size);
+ result = asn1_read_value(pbe_asn,
+ p->iv_name,
+ params->iv, &params->iv_size);
if (result != ASN1_SUCCESS) {
gnutls_assert();
result = _gnutls_asn2err(result);
@@ -991,6 +1107,47 @@ _gnutls_read_pkcs_schema_params(schema_id * schema, const char *password,
return result;
}
+static int
+_gnutls_pbes2_string_to_key(unsigned int pass_len, const char *password,
+ const struct pbkdf2_params *kdf_params,
+ int key_size, uint8_t *key)
+{
+ int result = 0;
+
+ if (kdf_params->mac == GNUTLS_MAC_SHA1)
+ pbkdf2_hmac_sha1(pass_len, (uint8_t *) password,
+ kdf_params->iter_count,
+ kdf_params->salt_size,
+ kdf_params->salt, key_size, key);
+ else if (kdf_params->mac == GNUTLS_MAC_SHA256)
+ pbkdf2_hmac_sha256(pass_len, (uint8_t *) password,
+ kdf_params->iter_count,
+ kdf_params->salt_size,
+ kdf_params->salt, key_size, key);
+#if ENABLE_GOST
+ else if (kdf_params->mac == GNUTLS_MAC_GOSTR_94)
+ pbkdf2_hmac_gosthash94cp(pass_len, (uint8_t *) password,
+ kdf_params->iter_count,
+ kdf_params->salt_size,
+ kdf_params->salt, key_size, key);
+ else if (kdf_params->mac == GNUTLS_MAC_STREEBOG_256)
+ pbkdf2_hmac_streebog256(pass_len, (uint8_t *) password,
+ kdf_params->iter_count,
+ kdf_params->salt_size,
+ kdf_params->salt, key_size, key);
+ else if (kdf_params->mac == GNUTLS_MAC_STREEBOG_512)
+ pbkdf2_hmac_streebog512(pass_len, (uint8_t *) password,
+ kdf_params->iter_count,
+ kdf_params->salt_size,
+ kdf_params->salt, key_size, key);
+#endif
+ else
+ result =
+ gnutls_assert_val(GNUTLS_E_UNKNOWN_HASH_ALGORITHM);
+
+ return result;
+}
+
int
_gnutls_pkcs_raw_decrypt_data(schema_id schema, ASN1_TYPE pkcs8_asn,
const char *root, const char *_password,
@@ -1056,19 +1213,11 @@ _gnutls_pkcs_raw_decrypt_data(schema_id schema, ASN1_TYPE pkcs8_asn,
*/
p = _gnutls_pkcs_schema_get(schema);
if (p != NULL && p->pbes2 != 0) { /* PBES2 */
- if (kdf_params->mac == GNUTLS_MAC_SHA1)
- pbkdf2_hmac_sha1(pass_len, (uint8_t *) password,
- kdf_params->iter_count,
- kdf_params->salt_size,
- kdf_params->salt, key_size, key);
- else if (kdf_params->mac == GNUTLS_MAC_SHA256)
- pbkdf2_hmac_sha256(pass_len, (uint8_t *) password,
- kdf_params->iter_count,
- kdf_params->salt_size,
- kdf_params->salt, key_size, key);
- else {
- ret =
- gnutls_assert_val(GNUTLS_E_UNKNOWN_HASH_ALGORITHM);
+ ret = _gnutls_pbes2_string_to_key(pass_len, password,
+ kdf_params,
+ key_size, key);
+ if (ret < 0) {
+ gnutls_assert();
goto error;
}
} else if (p != NULL) { /* PKCS 12 schema */
@@ -1187,6 +1336,7 @@ write_pbkdf2_params(ASN1_TYPE pasn, const struct pbkdf2_params *kdf_params)
int result;
ASN1_TYPE pbkdf2_asn = ASN1_TYPE_EMPTY;
uint8_t tmp[MAX_OID_SIZE];
+ const mac_entry_st *me;
/* Write the key derivation algorithm
*/
@@ -1249,9 +1399,22 @@ write_pbkdf2_params(ASN1_TYPE pasn, const struct pbkdf2_params *kdf_params)
goto error;
}
- /* We write an emptry prf.
- */
- result = asn1_write_value(pbkdf2_asn, "prf", NULL, 0);
+ me = _gnutls_mac_to_entry(kdf_params->mac);
+ if (!me || !me->mac_oid) {
+ gnutls_assert();
+ result = GNUTLS_E_INTERNAL_ERROR;
+ goto error;
+ }
+
+ result = asn1_write_value(pbkdf2_asn, "prf.algorithm",
+ me->mac_oid, strlen(me->mac_oid));
+ if (result != ASN1_SUCCESS) {
+ gnutls_assert();
+ result = _gnutls_asn2err(result);
+ goto error;
+ }
+
+ result = asn1_write_value(pbkdf2_asn, "prf.parameters", NULL, 0);
if (result != ASN1_SUCCESS) {
gnutls_assert();
result = _gnutls_asn2err(result);
@@ -1284,6 +1447,7 @@ write_pbes2_enc_params(ASN1_TYPE pasn, const struct pbe_enc_params *params)
int result;
ASN1_TYPE pbe_asn = ASN1_TYPE_EMPTY;
const struct pkcs_cipher_schema_st *p;
+ const char *cipher_oid;
/* Write the encryption algorithm
*/
@@ -1293,15 +1457,6 @@ write_pbes2_enc_params(ASN1_TYPE pasn, const struct pbe_enc_params *params)
return GNUTLS_E_INVALID_REQUEST;
}
- result =
- asn1_write_value(pasn, "encryptionScheme.algorithm", p->cipher_oid,
- 1);
- if (result != ASN1_SUCCESS) {
- gnutls_assert();
- goto error;
- }
- _gnutls_hard_log("encryptionScheme.algorithm: %s\n", p->cipher_oid);
-
/* Now check the encryption parameters.
*/
if ((result =
@@ -1311,8 +1466,36 @@ write_pbes2_enc_params(ASN1_TYPE pasn, const struct pbe_enc_params *params)
return _gnutls_asn2err(result);
}
+ if (p->schema == PBES2_GOST28147_89_TC26Z ||
+ p->schema == PBES2_GOST28147_89_CPA ||
+ p->schema == PBES2_GOST28147_89_CPB ||
+ p->schema == PBES2_GOST28147_89_CPC ||
+ p->schema == PBES2_GOST28147_89_CPD) {
+ cipher_oid = GOST28147_89_OID;
+ result = asn1_write_value(pbe_asn, "encryptionParamSet",
+ p->cipher_oid, 1);
+ if (result != ASN1_SUCCESS) {
+ gnutls_assert();
+ result = _gnutls_asn2err(result);
+ goto error;
+ }
+ } else {
+ cipher_oid = p->cipher_oid;
+ }
+
+ result =
+ asn1_write_value(pasn, "encryptionScheme.algorithm",
+ cipher_oid,
+ 1);
+ if (result != ASN1_SUCCESS) {
+ gnutls_assert();
+ goto error;
+ }
+ _gnutls_hard_log("encryptionScheme.algorithm: %s\n", cipher_oid);
+
/* read the salt */
- result = asn1_write_value(pbe_asn, "", params->iv, params->iv_size);
+ result = asn1_write_value(pbe_asn, p->iv_name,
+ params->iv, params->iv_size);
if (result != ASN1_SUCCESS) {
gnutls_assert();
result = _gnutls_asn2err(result);
@@ -1414,10 +1597,23 @@ _gnutls_pkcs_generate_key(schema_id schema,
*/
if (p->pbes2 != 0) {
- pbkdf2_hmac_sha1(pass_len, (uint8_t *) password,
- kdf_params->iter_count,
- kdf_params->salt_size, kdf_params->salt,
- kdf_params->key_size, key->data);
+ if (p->schema == PBES2_GOST28147_89_TC26Z)
+ kdf_params->mac = GNUTLS_MAC_STREEBOG_256;
+ else if (p->schema == PBES2_GOST28147_89_CPA ||
+ p->schema == PBES2_GOST28147_89_CPB ||
+ p->schema == PBES2_GOST28147_89_CPC ||
+ p->schema == PBES2_GOST28147_89_CPD)
+ kdf_params->mac = GNUTLS_MAC_GOSTR_94;
+ else
+ kdf_params->mac = GNUTLS_MAC_SHA1;
+ ret = _gnutls_pbes2_string_to_key(pass_len, password,
+ kdf_params,
+ kdf_params->key_size,
+ key->data);
+ if (ret < 0) {
+ gnutls_assert();
+ return ret;
+ }
if (enc_params->iv_size) {
ret = gnutls_rnd(GNUTLS_RND_NONCE,
@@ -1561,10 +1757,12 @@ _gnutls_pkcs_raw_encrypt_data(const gnutls_datum_t * plain,
cipher_hd_st ch;
int ch_init = 0;
uint8_t pad, pad_size;
+ const cipher_entry_st *ce;
- pad_size = gnutls_cipher_get_block_size(enc_params->cipher);
+ ce = cipher_to_entry(enc_params->cipher);
+ pad_size = _gnutls_cipher_get_block_size(ce);
- if (pad_size == 1) /* stream */
+ if (pad_size == 1 || ce->type == CIPHER_STREAM) /* stream */
pad_size = 0;
data = gnutls_malloc(plain->size + pad_size);
diff --git a/lib/x509/pkcs7_int.h b/lib/x509/pkcs7_int.h
index 9d3ea24e31..d9f07bf9a5 100644
--- a/lib/x509/pkcs7_int.h
+++ b/lib/x509/pkcs7_int.h
@@ -42,6 +42,11 @@ typedef enum schema_id {
PBES2_AES_128,
PBES2_AES_192,
PBES2_AES_256,
+ PBES2_GOST28147_89_TC26Z,
+ PBES2_GOST28147_89_CPA,
+ PBES2_GOST28147_89_CPB,
+ PBES2_GOST28147_89_CPC,
+ PBES2_GOST28147_89_CPD,
PKCS12_3DES_SHA1, /* the stuff in PKCS #12 */
PKCS12_ARCFOUR_SHA1,
PKCS12_RC2_40_SHA1,
@@ -57,6 +62,7 @@ struct pkcs_cipher_schema_st {
const char *cipher_oid;
const char *write_oid;
const char *desc;
+ const char *iv_name;
unsigned decrypt_only;
};
diff --git a/lib/x509/privkey.c b/lib/x509/privkey.c
index d4be99ef05..eea0b28b14 100644
--- a/lib/x509/privkey.c
+++ b/lib/x509/privkey.c
@@ -1173,6 +1173,91 @@ gnutls_x509_privkey_import_ecc_raw(gnutls_x509_privkey_t key,
}
+/**
+ * gnutls_x509_privkey_import_gost_raw:
+ * @key: The data to store the parsed key
+ * @curve: holds the curve
+ * @paramset: holds the parameters id
+ * @x: holds the x
+ * @y: holds the y
+ * @k: holds the k
+ *
+ * This function will convert the given GOST private key's parameters to the
+ * native #gnutls_x509_privkey_t format. The output will be stored
+ * in @key.
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise a
+ * negative error value.
+ *
+ * Since: 3.6.3
+ **/
+int
+gnutls_x509_privkey_import_gost_raw(gnutls_x509_privkey_t key,
+ gnutls_ecc_curve_t curve,
+ gnutls_digest_algorithm_t digest,
+ gnutls_gost_paramset_t paramset,
+ const gnutls_datum_t * x,
+ const gnutls_datum_t * y,
+ const gnutls_datum_t * k)
+{
+ int ret;
+
+ if (key == NULL) {
+ gnutls_assert();
+ return GNUTLS_E_INVALID_REQUEST;
+ }
+
+ if (paramset < 0) {
+ if (digest == GNUTLS_DIG_GOSTR_94)
+ paramset = GNUTLS_GOST_PARAMSET_CP_A;
+ else
+ paramset = GNUTLS_GOST_PARAMSET_TC26_Z;
+ }
+
+ key->params.curve = curve;
+ key->params.gost_params = paramset;
+ key->params.algo = _gnutls_digest_gost(digest);
+
+ if (_gnutls_mpi_init_scan_nz
+ (&key->params.params[GOST_X], x->data, x->size)) {
+ gnutls_assert();
+ ret = GNUTLS_E_MPI_SCAN_FAILED;
+ goto cleanup;
+ }
+ key->params.params_nr++;
+
+ if (_gnutls_mpi_init_scan_nz
+ (&key->params.params[GOST_Y], y->data, y->size)) {
+ gnutls_assert();
+ ret = GNUTLS_E_MPI_SCAN_FAILED;
+ goto cleanup;
+ }
+ key->params.params_nr++;
+
+ if (_gnutls_mpi_init_scan_nz
+ (&key->params.params[GOST_K], k->data, k->size)) {
+ gnutls_assert();
+ ret = GNUTLS_E_MPI_SCAN_FAILED;
+ goto cleanup;
+ }
+ key->params.params_nr++;
+
+ ret =
+ _gnutls_pk_fixup(key->params.algo, GNUTLS_IMPORT, &key->params);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+
+ return 0;
+
+ cleanup:
+ gnutls_pk_params_clear(&key->params);
+ gnutls_pk_params_release(&key->params);
+ return ret;
+
+}
+
/**
* gnutls_x509_privkey_get_pk_algorithm:
@@ -1456,6 +1541,42 @@ int gnutls_x509_privkey_export_ecc_raw(gnutls_x509_privkey_t key,
}
/**
+ * gnutls_x509_privkey_export_ecc_raw:
+ * @key: a key
+ * @curve: will hold the curve
+ * @digest: will hold the digest
+ * @paramset: will hold the parameters id
+ * @x: will hold the x coordinate
+ * @y: will hold the y coordinate
+ * @k: will hold the private key
+ *
+ * This function will export the GOST private key's parameters found
+ * in the given structure. The new parameters will be allocated using
+ * gnutls_malloc() and will be stored in the appropriate datum.
+ *
+ * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, otherwise a
+ * negative error value.
+ *
+ * Since: 3.6.3
+ **/
+int gnutls_x509_privkey_export_gost_raw(gnutls_x509_privkey_t key,
+ gnutls_ecc_curve_t * curve,
+ gnutls_digest_algorithm_t * digest,
+ gnutls_gost_paramset_t * paramset,
+ gnutls_datum_t * x,
+ gnutls_datum_t * y,
+ gnutls_datum_t * k)
+{
+ if (key == NULL) {
+ gnutls_assert();
+ return GNUTLS_E_INVALID_REQUEST;
+ }
+
+ return _gnutls_params_get_gost_raw(&key->params, curve, digest, paramset,
+ x, y, k, 0);
+}
+
+/**
* gnutls_x509_privkey_export_rsa_raw:
* @key: a key
* @m: will hold the modulus
@@ -1656,6 +1777,32 @@ gnutls_x509_privkey_generate2(gnutls_x509_privkey_t key,
}
}
+ if (IS_GOSTEC(algo)) {
+ unsigned params;
+ int size;
+
+ if (algo == GNUTLS_PK_GOST_01)
+ params = GNUTLS_GOST_PARAMSET_CP_A;
+ else
+ params = GNUTLS_GOST_PARAMSET_TC26_Z;
+
+ if (GNUTLS_BITS_ARE_CURVE(bits))
+ bits = GNUTLS_BITS_TO_CURVE(bits);
+ else
+ bits = _gnutls_ecc_bits_to_curve(algo, bits);
+
+ size = gnutls_ecc_curve_get_size(bits);
+
+ if ((algo == GNUTLS_PK_GOST_01 && size != 32) ||
+ (algo == GNUTLS_PK_GOST_12_256 && size != 32) ||
+ (algo == GNUTLS_PK_GOST_12_512 && size != 64)) {
+ _gnutls_debug_log("curve is incompatible with public key algorithm\n");
+ return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+ }
+
+ key->params.gost_params = params;
+ }
+
if (flags & GNUTLS_PRIVKEY_FLAG_PROVABLE) {
key->params.pkflags |= GNUTLS_PK_FLAG_PROVABLE;
}
diff --git a/lib/x509/privkey_pkcs8.c b/lib/x509/privkey_pkcs8.c
index 7e58099e45..263dafc265 100644
--- a/lib/x509/privkey_pkcs8.c
+++ b/lib/x509/privkey_pkcs8.c
@@ -78,6 +78,32 @@ _encode_privkey(gnutls_x509_privkey_t pkey, gnutls_datum_t * raw)
gnutls_assert();
return ret;
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ if ((ret = asn1_create_element
+ (_gnutls_get_gnutls_asn(), "GNUTLS.GOSTPrivateKey", &spk))
+ != ASN1_SUCCESS) {
+ gnutls_assert();
+ ret = _gnutls_asn2err(ret);
+ goto error;
+ }
+
+ ret = _gnutls_x509_write_key_int_le(spk, "", pkey->params.params[GOST_K]);
+ if (ret < 0) {
+ gnutls_assert();
+ goto error;
+ }
+
+ ret = _gnutls_x509_der_encode(spk, "", raw, 0);
+ if (ret < 0) {
+ gnutls_assert();
+ goto error;
+ }
+
+ asn1_delete_structure2(&spk, ASN1_DELETE_FLAG_ZEROIZE);
+ break;
+
case GNUTLS_PK_RSA:
case GNUTLS_PK_RSA_PSS:
case GNUTLS_PK_ECDSA:
@@ -1101,6 +1127,159 @@ _decode_pkcs8_eddsa_key(ASN1_TYPE pkcs8_asn, gnutls_x509_privkey_t pkey, const c
}
}
+/* Converts a GOST key to
+ * an internal structure (gnutls_private_key)
+ */
+static int
+_privkey_decode_gost_key(const gnutls_datum_t * raw_key,
+ gnutls_x509_privkey_t pkey)
+{
+ int ret;
+
+ if (raw_key->data[0] == ASN1_TAG_INTEGER) {
+ ASN1_TYPE pkey_asn;
+
+ if ((ret = asn1_create_element(_gnutls_get_gnutls_asn(),
+ "GNUTLS.GOSTPrivateKeyOld",
+ &pkey_asn)) != ASN1_SUCCESS) {
+ gnutls_assert();
+ ret = _gnutls_asn2err(ret);
+ goto error;
+ }
+
+ ret = _asn1_strict_der_decode(&pkey_asn,
+ raw_key->data, raw_key->size,
+ NULL);
+ if (ret != ASN1_SUCCESS) {
+ gnutls_assert();
+ ret = _gnutls_asn2err(ret);
+ asn1_delete_structure2(&pkey_asn, ASN1_DELETE_FLAG_ZEROIZE);
+ goto error;
+ }
+
+ ret = _gnutls_x509_read_key_int(pkey_asn, "",
+ &pkey->params.params[GOST_K]);
+ if (ret < 0) {
+ gnutls_assert();
+ asn1_delete_structure2(&pkey_asn, ASN1_DELETE_FLAG_ZEROIZE);
+ goto error;
+ }
+ asn1_delete_structure2(&pkey_asn, ASN1_DELETE_FLAG_ZEROIZE);
+ } else if (raw_key->data[0] == ASN1_TAG_OCTET_STRING) {
+ ASN1_TYPE pkey_asn;
+
+ if ((ret = asn1_create_element(_gnutls_get_gnutls_asn(),
+ "GNUTLS.GOSTPrivateKey",
+ &pkey_asn)) != ASN1_SUCCESS) {
+ gnutls_assert();
+ ret = _gnutls_asn2err(ret);
+ goto error;
+ }
+
+ ret = _asn1_strict_der_decode(&pkey_asn,
+ raw_key->data, raw_key->size,
+ NULL);
+ if (ret != ASN1_SUCCESS) {
+ gnutls_assert();
+ ret = _gnutls_asn2err(ret);
+ asn1_delete_structure2(&pkey_asn, ASN1_DELETE_FLAG_ZEROIZE);
+ goto error;
+ }
+
+ ret = _gnutls_x509_read_key_int_le(pkey_asn, "",
+ &pkey->params.params[GOST_K]);
+ if (ret < 0) {
+ gnutls_assert();
+ asn1_delete_structure2(&pkey_asn, ASN1_DELETE_FLAG_ZEROIZE);
+ goto error;
+ }
+ asn1_delete_structure2(&pkey_asn, ASN1_DELETE_FLAG_ZEROIZE);
+ } else { /* Custom but also used format, no encap */
+ gnutls_assert();
+ ret = GNUTLS_E_PARSING_ERROR;
+ goto error;
+ }
+
+ pkey->params.params_nr++;
+
+ return 0;
+
+ error:
+ return ret;
+
+}
+
+/* Decodes a GOST privateKey from a PKCS8 structure.
+ */
+static int
+_decode_pkcs8_gost_key(ASN1_TYPE pkcs8_asn, gnutls_x509_privkey_t pkey,
+ gnutls_pk_algorithm_t algo)
+{
+ int ret;
+ gnutls_datum_t tmp;
+ unsigned char oid[3 * MAX_OID_SIZE]; /* GOST parameters can have 3 OIDs at most */
+ int len, result;
+
+ gnutls_pk_params_init(&pkey->params);
+
+ len = sizeof(oid);
+ result = asn1_read_value(pkcs8_asn, "privateKeyAlgorithm.parameters",
+ oid, &len);
+ if (result != ASN1_SUCCESS) {
+ gnutls_assert();
+ ret = GNUTLS_E_PARSING_ERROR;
+ goto error;
+ } else {
+ ret = _gnutls_x509_read_gost_params(oid, len, &pkey->params);
+ if (ret < 0) {
+ gnutls_assert();
+ goto error;
+ }
+ }
+
+ /* Will be fixed later by pk_fixup */
+ ret = _gnutls_mpi_init(&pkey->params.params[GOST_X]);
+ if (ret < 0) {
+ gnutls_assert();
+ goto error;
+ }
+ pkey->params.params_nr++;
+
+ ret = _gnutls_mpi_init(&pkey->params.params[GOST_Y]);
+ if (ret < 0) {
+ gnutls_assert();
+ goto error;
+ }
+ pkey->params.params_nr++;
+
+ _gnutls_mpi_set_ui(pkey->params.params[GOST_X], 0);
+ _gnutls_mpi_set_ui(pkey->params.params[GOST_Y], 0);
+
+ ret = _gnutls_x509_read_value(pkcs8_asn, "privateKey", &tmp);
+ if (ret < 0) {
+ gnutls_assert();
+ goto error;
+ }
+
+ ret = _privkey_decode_gost_key(&tmp, pkey);
+ _gnutls_free_key_datum(&tmp);
+
+ if (ret < 0) {
+ gnutls_assert();
+ goto error;
+ }
+
+ pkey->params.algo = algo;
+
+ return 0;
+
+error:
+ gnutls_pk_params_clear(&pkey->params);
+ gnutls_pk_params_release(&pkey->params);
+
+ return ret;
+}
+
/* Decodes an DSA privateKey and params from a PKCS8 structure.
*/
static int
@@ -1252,6 +1431,12 @@ decode_private_key_info(const gnutls_datum_t * der,
case GNUTLS_PK_EDDSA_ED25519:
result = _decode_pkcs8_eddsa_key(pkcs8_asn, pkey, oid);
break;
+ case GNUTLS_PK_GOST_01:
+ case GNUTLS_PK_GOST_12_256:
+ case GNUTLS_PK_GOST_12_512:
+ result = _decode_pkcs8_gost_key(pkcs8_asn,
+ pkey, pkey->params.algo);
+ break;
default:
result = gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE);
goto error;
diff --git a/lib/x509/x509.c b/lib/x509/x509.c
index 74040a4e9d..721a1a0a93 100644
--- a/lib/x509/x509.c
+++ b/lib/x509/x509.c
@@ -3523,6 +3523,59 @@ gnutls_x509_crt_get_pk_ecc_raw(gnutls_x509_crt_t crt,
}
/**
+ * gnutls_x509_crt_get_pk_gost_raw:
+ * @crt: Holds the certificate
+ * @curve: will hold the curve
+ * @paramset: will hold paramset
+ * @x: will hold x
+ * @y: will hold y
+ *
+ * This function will export the GOST public key's parameters found in
+ * the given certificate. The new parameters will be allocated using
+ * gnutls_malloc() and will be stored in the appropriate datum.
+ *
+ * Returns: %GNUTLS_E_SUCCESS on success, otherwise a negative error code.
+ *
+ * Since: 3.6.3
+ **/
+int
+gnutls_x509_crt_get_pk_gost_raw(gnutls_x509_crt_t crt,
+ gnutls_ecc_curve_t * curve,
+ gnutls_digest_algorithm_t * digest,
+ gnutls_gost_paramset_t *paramset,
+ gnutls_datum_t * x, gnutls_datum_t * y)
+{
+ int ret;
+ gnutls_pubkey_t pubkey;
+
+ if (crt == NULL) {
+ gnutls_assert();
+ return GNUTLS_E_INVALID_REQUEST;
+ }
+
+ ret = gnutls_pubkey_init(&pubkey);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+
+ ret = gnutls_pubkey_import_x509(pubkey, crt, 0);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+
+ ret = gnutls_pubkey_export_gost_raw2(pubkey, curve, digest,
+ paramset, x, y, 0);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+
+ cleanup:
+ gnutls_pubkey_deinit(pubkey);
+ return ret;
+}
+
+/**
* gnutls_x509_crt_get_pk_dsa_raw:
* @crt: Holds the certificate
* @p: will hold the p
diff --git a/lib/x509/x509_int.h b/lib/x509/x509_int.h
index 3dd3985cf3..a38ed8a3fc 100644
--- a/lib/x509/x509_int.h
+++ b/lib/x509/x509_int.h
@@ -48,6 +48,11 @@
#define HASH_OID_SHA3_256 "2.16.840.1.101.3.4.2.8"
#define HASH_OID_SHA3_384 "2.16.840.1.101.3.4.2.9"
#define HASH_OID_SHA3_512 "2.16.840.1.101.3.4.2.10"
+#define HASH_OID_GOST_R_3411_94 "1.2.643.2.2.9"
+#define HASH_OID_STREEBOG_256 "1.2.643.7.1.1.2.2"
+#define HASH_OID_STREEBOG_512 "1.2.643.7.1.1.2.3"
+
+#define HASH_OID_GOST_R_3411_94_CRYPTOPRO_PARAMS "1.2.643.2.2.30.1"
#define OID_ATTR_PROV_SEED "1.3.6.1.4.1.2312.18.8.1"
@@ -257,6 +262,10 @@ int
_gnutls_x509_read_ecc_params(uint8_t * der, int dersize,
unsigned int *curve);
+int
+_gnutls_x509_read_gost_params(uint8_t * der, int dersize,
+ gnutls_pk_params_st * params);
+
int _gnutls_asn1_encode_privkey(ASN1_TYPE * c2,
gnutls_pk_params_st * params);
@@ -374,6 +383,11 @@ int _gnutls_x509_read_key_int(ASN1_TYPE node, const char *value,
int _gnutls_x509_write_key_int(ASN1_TYPE node, const char *value, bigint_t mpi,
int lz);
+int _gnutls_x509_read_key_int_le(ASN1_TYPE node, const char *value,
+ bigint_t * ret_mpi);
+int _gnutls_x509_write_key_int_le(ASN1_TYPE node, const char *value,
+ bigint_t mpi);
+
int _gnutls_x509_read_pkalgo_params(ASN1_TYPE src, const char *src_name,
gnutls_x509_spki_st *params, unsigned is_sig);
int _gnutls_x509_write_sign_params(ASN1_TYPE dst, const char *dst_name,
diff --git a/m4/hooks.m4 b/m4/hooks.m4
index 69d9d8c184..8a7bcd6eef 100644
--- a/m4/hooks.m4
+++ b/m4/hooks.m4
@@ -303,6 +303,20 @@ LIBTASN1_MINIMUM=4.9
fi
AM_CONDITIONAL(ENABLE_ECDHE, test "$ac_enable_ecdhe" != "no")
+ AC_MSG_CHECKING([whether to disable GOST support])
+ AC_ARG_ENABLE(gost,
+ AS_HELP_STRING([--disable-gost],
+ [disable the GOST support]),
+ ac_enable_gost=$enableval, ac_enable_gost=yes)
+ if test x$ac_enable_gost != xno; then
+ AC_MSG_RESULT(no)
+ AC_DEFINE([ENABLE_GOST], 1, [enable GOST])
+ else
+ ac_full=0
+ AC_MSG_RESULT(yes)
+ fi
+ AM_CONDITIONAL(ENABLE_GOST, test "$ac_enable_gost" != "no")
+
# For cryptodev
AC_MSG_CHECKING([whether to add cryptodev support])
AC_ARG_ENABLE(cryptodev,
diff --git a/src/certtool-cfg.c b/src/certtool-cfg.c
index 4470911088..b4894e63a6 100644
--- a/src/certtool-cfg.c
+++ b/src/certtool-cfg.c
@@ -262,7 +262,7 @@ void cfg_init(void)
{ \
char str[512]; \
char * p; \
- int len; \
+ size_t len; \
if (s_name == NULL) { \
i = 0; \
s_name = malloc(sizeof(char*)*MAX_ENTRIES); \
@@ -2587,8 +2587,7 @@ int get_data_encipherment_status(void)
if (batch) {
return cfg.data_encipherment;
} else {
- /* this option is not asked in interactive mode */
- return 0;
+ return read_yesno("Will the certificate be used for data encryption? (Y/n): ", 1);
}
}
diff --git a/src/certtool-common.c b/src/certtool-common.c
index c020e97e3e..858de98163 100644
--- a/src/certtool-common.c
+++ b/src/certtool-common.c
@@ -907,6 +907,61 @@ print_ecc_pkey(FILE * outfile, gnutls_ecc_curve_t curve,
}
}
+static const char *
+gost_param_name(int param)
+{
+ switch(param) {
+ case 0:
+ return "TC26-Z";
+ case 1:
+ return "CryptoPro-A";
+ case 2:
+ return "CryptoPro-B";
+ case 3:
+ return "CryptoPro-C";
+ case 4:
+ return "CryptoPro-D";
+ default:
+ return "unknown";
+ }
+}
+
+void
+print_gost_pkey(FILE * outfile, gnutls_ecc_curve_t curve,
+ gnutls_digest_algorithm_t digest, gnutls_gost_paramset_t paramset,
+ gnutls_datum_t * k, gnutls_datum_t * x, gnutls_datum_t * y,
+ int cprint)
+{
+ if (cprint != 0)
+ fprintf(outfile, "/* curve: %s */\n",
+ gnutls_ecc_curve_get_name(curve));
+ else
+ fprintf(outfile, "curve:\t%s\n",
+ gnutls_ecc_curve_get_name(curve));
+
+ if (cprint != 0)
+ fprintf(outfile, "/* digest: %s */\n",
+ gnutls_digest_get_name(digest));
+ else
+ fprintf(outfile, "digest:\t%s\n",
+ gnutls_digest_get_name(digest));
+
+ if (cprint != 0)
+ fprintf(outfile, "/* paramset: %s */\n",
+ gost_param_name(paramset));
+ else
+ fprintf(outfile, "paramset:\t%s\n",
+ gost_param_name(paramset));
+
+ if (k) {
+ print_head(outfile, "private key", k->size, cprint);
+ print_hex_datum(outfile, k, cprint);
+ }
+ print_head(outfile, "x", x->size, cprint);
+ print_hex_datum(outfile, x, cprint);
+ print_head(outfile, "y", y->size, cprint);
+ print_hex_datum(outfile, y, cprint);
+}
void
print_rsa_pkey(FILE * outfile, gnutls_datum_t * m, gnutls_datum_t * e,
@@ -1107,6 +1162,16 @@ int cipher_to_flags(const char *cipher)
return GNUTLS_PKCS_USE_PBES2_AES_256;
} else if (strcasecmp(cipher, "rc2-40") == 0) {
return GNUTLS_PKCS_USE_PKCS12_RC2_40;
+ } else if (strcasecmp(cipher, "gost28147-tc26z") == 0) {
+ return GNUTLS_PKCS_USE_PBES2_GOST_TC26Z;
+ } else if (strcasecmp(cipher, "gost28147-cpa") == 0) {
+ return GNUTLS_PKCS_USE_PBES2_GOST_CPA;
+ } else if (strcasecmp(cipher, "gost28147-cpb") == 0) {
+ return GNUTLS_PKCS_USE_PBES2_GOST_CPB;
+ } else if (strcasecmp(cipher, "gost28147-cpc") == 0) {
+ return GNUTLS_PKCS_USE_PBES2_GOST_CPC;
+ } else if (strcasecmp(cipher, "gost28147-cpd") == 0) {
+ return GNUTLS_PKCS_USE_PBES2_GOST_CPD;
}
fprintf(stderr, "unknown cipher %s\n", cipher);
@@ -1233,6 +1298,32 @@ static void privkey_info_int(FILE *outfile, common_info_st * cinfo,
gnutls_free(y.data);
gnutls_free(k.data);
}
+ } else if (key_type == GNUTLS_PK_GOST_01 ||
+ key_type == GNUTLS_PK_GOST_12_256 ||
+ key_type == GNUTLS_PK_GOST_12_512) {
+ gnutls_datum_t y, x, k;
+ gnutls_ecc_curve_t curve;
+ gnutls_digest_algorithm_t digest;
+ gnutls_gost_paramset_t paramset;
+
+ ret =
+ gnutls_x509_privkey_export_gost_raw(key, &curve,
+ &digest,
+ &paramset,
+ &x, &y, &k);
+ if (ret < 0)
+ fprintf(stderr,
+ "Error in key GOST data export: %s\n",
+ gnutls_strerror(ret));
+ else {
+ print_gost_pkey(outfile, curve, digest, paramset,
+ &k, &x, &y,
+ cinfo->cprint);
+
+ gnutls_free(x.data);
+ gnutls_free(y.data);
+ gnutls_free(k.data);
+ }
}
size = lbuffer_size;
@@ -1539,6 +1630,12 @@ gnutls_pk_algorithm_t figure_key_type(const char *key_type)
return GNUTLS_PK_DSA;
else if (strcasecmp(key_type, "ecdsa") == 0 || strcasecmp(key_type, "ecc") == 0)
return GNUTLS_PK_ECDSA;
+ else if (strcasecmp(key_type, "gost01") == 0)
+ return GNUTLS_PK_GOST_01;
+ else if (strcasecmp(key_type, "gost12-256") == 0)
+ return GNUTLS_PK_GOST_12_256;
+ else if (strcasecmp(key_type, "gost12-512") == 0)
+ return GNUTLS_PK_GOST_12_512;
else {
fprintf(stderr, "unknown key type: %s\n", key_type);
return GNUTLS_PK_UNKNOWN;
diff --git a/src/certtool-common.h b/src/certtool-common.h
index 11cbc8a23d..3dac2ae3c1 100644
--- a/src/certtool-common.h
+++ b/src/certtool-common.h
@@ -87,7 +87,9 @@ void switch_to_pkcs8_when_needed(common_info_st *cinfo, gnutls_x509_privkey_t ke
if (cinfo->pkcs8)
return;
- if ((key_type == GNUTLS_PK_RSA_PSS || key_type == GNUTLS_PK_EDDSA_ED25519)) {
+ if (key_type == GNUTLS_PK_RSA_PSS || key_type == GNUTLS_PK_EDDSA_ED25519 ||
+ key_type == GNUTLS_PK_GOST_01 || key_type == GNUTLS_PK_GOST_12_256 ||
+ key_type == GNUTLS_PK_GOST_12_512) {
if (cinfo->verbose)
fprintf(stderr, "Assuming --pkcs8 is given; %s private keys can only be exported in PKCS#8 format\n",
gnutls_pk_algorithm_get_name(key_type));
@@ -153,6 +155,11 @@ void _pubkey_info(FILE * outfile, gnutls_certificate_print_formats_t,
void print_ecc_pkey(FILE * outfile, gnutls_ecc_curve_t curve,
gnutls_datum_t * k, gnutls_datum_t * x,
gnutls_datum_t * y, int cprint);
+void print_gost_pkey(FILE * outfile, gnutls_ecc_curve_t curve,
+ gnutls_digest_algorithm_t digest,
+ gnutls_gost_paramset_t paramset,
+ gnutls_datum_t * k, gnutls_datum_t * x,
+ gnutls_datum_t * y, int cprint);
void print_rsa_pkey(FILE * outfile, gnutls_datum_t * m, gnutls_datum_t * e,
gnutls_datum_t * d, gnutls_datum_t * p,
gnutls_datum_t * q, gnutls_datum_t * u,
diff --git a/src/certtool.c b/src/certtool.c
index 5bac31f12c..315c23c527 100644
--- a/src/certtool.c
+++ b/src/certtool.c
@@ -149,7 +149,11 @@ generate_private_key_int(common_info_st * cinfo)
bits = get_bits(key_type, cinfo->bits, cinfo->sec_param, 1);
- if (key_type == GNUTLS_PK_ECDSA || key_type == GNUTLS_PK_EDDSA_ED25519) {
+ if (key_type == GNUTLS_PK_ECDSA ||
+ key_type == GNUTLS_PK_EDDSA_ED25519 ||
+ key_type == GNUTLS_PK_GOST_01 ||
+ key_type == GNUTLS_PK_GOST_12_256 ||
+ key_type == GNUTLS_PK_GOST_12_512) {
char name[64];
int ecc_bits;
@@ -541,7 +545,10 @@ generate_certificate(gnutls_privkey_t * ret_key,
}
if (!ca_status || server) {
- if (pk == GNUTLS_PK_RSA) { /* DSA and ECDSA keys can only sign. */
+ if (pk == GNUTLS_PK_RSA ||
+ pk == GNUTLS_PK_GOST_01 ||
+ pk == GNUTLS_PK_GOST_12_256 ||
+ pk == GNUTLS_PK_GOST_12_512) { /* DSA and ECDSA keys can only sign. */
result = get_sign_status(server);
if (result)
usage |=
@@ -1881,7 +1888,10 @@ void generate_request(common_info_st * cinfo)
app_exit(1);
}
- if (pk == GNUTLS_PK_RSA) {
+ if (pk == GNUTLS_PK_RSA ||
+ pk == GNUTLS_PK_GOST_01 ||
+ pk == GNUTLS_PK_GOST_12_256 ||
+ pk == GNUTLS_PK_GOST_12_512) {
ret = get_sign_status(1);
if (ret)
usage |= GNUTLS_KEY_DIGITAL_SIGNATURE;
@@ -2903,6 +2913,7 @@ void generate_pkcs12(common_info_st * cinfo)
gnutls_x509_crl_t *crls;
gnutls_x509_crt_t *crts, ca_crt;
gnutls_x509_privkey_t *keys;
+ gnutls_mac_algorithm_t mac;
int result;
size_t size;
gnutls_datum_t data;
@@ -2929,6 +2940,11 @@ void generate_pkcs12(common_info_st * cinfo)
app_exit(1);
}
+ if (cinfo->hash != GNUTLS_DIG_UNKNOWN)
+ mac = cinfo->hash;
+ else
+ mac = GNUTLS_MAC_SHA1;
+
if (HAVE_OPT(P12_NAME)) {
name = OPT_ARG(P12_NAME);
} else {
@@ -3155,7 +3171,7 @@ void generate_pkcs12(common_info_st * cinfo)
gnutls_pkcs12_bag_deinit(kbag);
}
- result = gnutls_pkcs12_generate_mac(pkcs12, pass);
+ result = gnutls_pkcs12_generate_mac2(pkcs12, mac, pass);
if (result < 0) {
fprintf(stderr, "generate_mac: %s\n",
gnutls_strerror(result));
diff --git a/symbols.last b/symbols.last
index c5b94fdd1e..cadbd97014 100644
--- a/symbols.last
+++ b/symbols.last
@@ -144,6 +144,7 @@ gnutls_db_set_remove_function@GNUTLS_3_4
gnutls_db_set_retrieve_function@GNUTLS_3_4
gnutls_db_set_store_function@GNUTLS_3_4
gnutls_decode_ber_digest_info@GNUTLS_3_4
+gnutls_decode_gost_rs_value@GNUTLS_3_6_3
gnutls_decode_rs_value@GNUTLS_3_6_0
gnutls_deinit@GNUTLS_3_4
gnutls_dh_get_group@GNUTLS_3_4
@@ -184,6 +185,7 @@ gnutls_ecc_curve_get_pk@GNUTLS_3_4
gnutls_ecc_curve_get_size@GNUTLS_3_4
gnutls_ecc_curve_list@GNUTLS_3_4
gnutls_encode_ber_digest_info@GNUTLS_3_4
+gnutls_encode_gost_rs_value@GNUTLS_3_6_3
gnutls_encode_rs_value@GNUTLS_3_6_0
gnutls_error_is_fatal@GNUTLS_3_4
gnutls_error_to_alert@GNUTLS_3_4
@@ -218,6 +220,8 @@ gnutls_global_set_log_level@GNUTLS_3_4
gnutls_global_set_mem_functions@GNUTLS_3_4
gnutls_global_set_mutex@GNUTLS_3_4
gnutls_global_set_time_function@GNUTLS_3_4
+gnutls_gost_paramset_get_name@GNUTLS_3_6_3
+gnutls_gost_paramset_get_oid@GNUTLS_3_6_3
gnutls_group_get@GNUTLS_3_6_0
gnutls_group_get_id@GNUTLS_3_6_0
gnutls_group_get_name@GNUTLS_3_6_0
@@ -318,6 +322,7 @@ gnutls_ocsp_status_request_get@GNUTLS_3_4
gnutls_ocsp_status_request_is_checked@GNUTLS_3_4
gnutls_oid_to_digest@GNUTLS_3_4
gnutls_oid_to_ecc_curve@GNUTLS_3_4
+gnutls_oid_to_gost_paramset@GNUTLS_3_6_3
gnutls_oid_to_mac@GNUTLS_3_4
gnutls_oid_to_pk@GNUTLS_3_4
gnutls_oid_to_sign@GNUTLS_3_4
@@ -553,6 +558,7 @@ gnutls_privkey_export_dsa_raw2@GNUTLS_3_6_0
gnutls_privkey_export_dsa_raw@GNUTLS_3_4
gnutls_privkey_export_ecc_raw2@GNUTLS_3_6_0
gnutls_privkey_export_ecc_raw@GNUTLS_3_4
+gnutls_privkey_export_gost_raw2@GNUTLS_3_6_3
gnutls_privkey_export_openpgp@GNUTLS_3_4
gnutls_privkey_export_pkcs11@GNUTLS_3_4
gnutls_privkey_export_rsa_raw2@GNUTLS_3_6_0
@@ -570,6 +576,7 @@ gnutls_privkey_import_ext2@GNUTLS_3_4
gnutls_privkey_import_ext3@GNUTLS_3_4
gnutls_privkey_import_ext4@GNUTLS_3_6_0
gnutls_privkey_import_ext@GNUTLS_3_4
+gnutls_privkey_import_gost_raw@GNUTLS_3_6_3
gnutls_privkey_import_openpgp@GNUTLS_3_4
gnutls_privkey_import_openpgp_raw@GNUTLS_3_4
gnutls_privkey_import_pkcs11@GNUTLS_3_4
@@ -618,6 +625,7 @@ gnutls_pubkey_export_dsa_raw@GNUTLS_3_4
gnutls_pubkey_export_ecc_raw2@GNUTLS_3_6_0
gnutls_pubkey_export_ecc_raw@GNUTLS_3_4
gnutls_pubkey_export_ecc_x962@GNUTLS_3_4
+gnutls_pubkey_export_gost_raw2@GNUTLS_3_6_3
gnutls_pubkey_export_rsa_raw2@GNUTLS_3_6_0
gnutls_pubkey_export_rsa_raw@GNUTLS_3_4
gnutls_pubkey_get_key_id@GNUTLS_3_4
@@ -630,6 +638,7 @@ gnutls_pubkey_import@GNUTLS_3_4
gnutls_pubkey_import_dsa_raw@GNUTLS_3_4
gnutls_pubkey_import_ecc_raw@GNUTLS_3_4
gnutls_pubkey_import_ecc_x962@GNUTLS_3_4
+gnutls_pubkey_import_gost_raw@GNUTLS_3_6_3
gnutls_pubkey_import_openpgp@GNUTLS_3_4
gnutls_pubkey_import_openpgp_raw@GNUTLS_3_4
gnutls_pubkey_import_pkcs11@GNUTLS_3_4
@@ -975,6 +984,7 @@ gnutls_x509_crt_get_name_constraints@GNUTLS_3_4
gnutls_x509_crt_get_pk_algorithm@GNUTLS_3_4
gnutls_x509_crt_get_pk_dsa_raw@GNUTLS_3_4
gnutls_x509_crt_get_pk_ecc_raw@GNUTLS_3_4
+gnutls_x509_crt_get_pk_gost_raw@GNUTLS_3_6_3
gnutls_x509_crt_get_pk_oid@GNUTLS_3_4
gnutls_x509_crt_get_pk_rsa_raw@GNUTLS_3_4
gnutls_x509_crt_get_policy@GNUTLS_3_4
@@ -1117,6 +1127,7 @@ gnutls_x509_privkey_export2_pkcs8@GNUTLS_3_4
gnutls_x509_privkey_export@GNUTLS_3_4
gnutls_x509_privkey_export_dsa_raw@GNUTLS_3_4
gnutls_x509_privkey_export_ecc_raw@GNUTLS_3_4
+gnutls_x509_privkey_export_gost_raw@GNUTLS_3_6_3
gnutls_x509_privkey_export_pkcs8@GNUTLS_3_4
gnutls_x509_privkey_export_rsa_raw2@GNUTLS_3_4
gnutls_x509_privkey_export_rsa_raw@GNUTLS_3_4
@@ -1132,6 +1143,7 @@ gnutls_x509_privkey_import2@GNUTLS_3_4
gnutls_x509_privkey_import@GNUTLS_3_4
gnutls_x509_privkey_import_dsa_raw@GNUTLS_3_4
gnutls_x509_privkey_import_ecc_raw@GNUTLS_3_4
+gnutls_x509_privkey_import_gost_raw@GNUTLS_3_6_3
gnutls_x509_privkey_import_openssl@GNUTLS_3_4
gnutls_x509_privkey_import_pkcs8@GNUTLS_3_4
gnutls_x509_privkey_import_rsa_raw2@GNUTLS_3_4
diff --git a/tests/Makefile.am b/tests/Makefile.am
index c0beb5acda..437da63e6e 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -159,7 +159,8 @@ ctests += mini-record-2 simple gnutls_hmac_fast set_pkcs12_cred cert certuniquei
client-sign-md5-rep tls12-invalid-key-exchanges session-rdn-read \
tls13-cert-key-exchange x509-cert-callback-ocsp gnutls_ocsp_resp_list_import2 \
server-sign-md5-rep privkey-keygen mini-tls-nonblock no-signal pkcs7-gen dtls-etm \
- x509sign-verify-rsa x509sign-verify-ecdsa mini-alignment oids atfork prf psk-file \
+ x509sign-verify-rsa x509sign-verify-ecdsa x509sign-verify-gost \
+ mini-alignment oids atfork prf psk-file \
status-request status-request-ok status-request-missing sign-verify-ext \
fallback-scsv pkcs8-key-decode urls dtls-rehandshake-cert \
key-usage-rsa key-usage-ecdhe-rsa mini-session-verify-function auto-verify \
diff --git a/tests/cert-common.h b/tests/cert-common.h
index 7f312988ff..dcae0104e5 100644
--- a/tests/cert-common.h
+++ b/tests/cert-common.h
@@ -28,10 +28,16 @@
* CA: ca3_cert, ca3_key
* TLS client: cli_ca3_cert, cli_ca3_key
* TLS client (RSA PSS): cli_ca3_rsa_pss_cert, cli_ca3_rsa_pss_key
+ * TLS client (GOST R 34.10-2001): cligost01_ca3_cert, cligost01_ca3_key
+ * TLS client (GOST R 34.10-2012-256): cligost12_256_ca3_cert, cligost12_256_ca3_key
+ * TLS client (GOST R 34.10-2012-512): cligost12_512_ca3_cert, cligost12_512_ca3_key
* IPv4 server (SAN: IPAddr: 127.0.0.1): server_ca3_ipaddr_cert, server_ca3_key
* IPv4 server (RSA-PSS, SAN: localhost IPAddr: 127.0.0.1): server_ca3_rsa_pss_cert, server_ca3_rsa_pss_key
* IPv4 server (RSA-PSS key, SAN: localhost IPAddr: 127.0.0.1): server_ca3_rsa_pss2_cert, server_ca3_rsa_pss2_key
* IPv4 server (EdDSA, SAN: localhost IPAddr: 127.0.0.1): server_ca3_eddsa_cert, server_ca3_eddsa_key
+ * IPv4 server (GOST R 34.10-2001, SAN: localhost): server_ca3_gost01_cert, server_ca3_gost01_key
+ * IPv4 server (GOST R 34.10-2012-256, SAN: localhost): server_ca3_gost12-256_cert, server_ca3_gost12-256_key
+ * IPv4 server (GOST R 34.10-2012-512, SAN: localhost): server_ca3_gost12-512_cert, server_ca3_gost12-512_key
* IPv6 server: server_ca3_localhost6_cert, server_ca3_key
* IPv4 server: server_ca3_localhost_cert, server_ca3_key
* IPv4 server: server_ca3_localhost_ecc_cert, server_ca3_ecc_key
@@ -736,6 +742,111 @@ const gnutls_datum_t clidsa_ca3_cert = { (unsigned char*)clidsa_ca3_cert_pem,
sizeof(clidsa_ca3_cert_pem)-1
};
+static char cligost01_ca3_cert_pem[] =
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIIC4zCCAUugAwIBAgIIWcZXXAz6FbgwDQYJKoZIhvcNAQELBQAwDzENMAsGA1UE\n"
+ "AxMEQ0EtMzAgFw0xNzA5MjMxMjQ1MTdaGA85OTk5MTIzMTIzNTk1OVowGzEZMBcG\n"
+ "A1UEAxMQR09TVC0yMDAxIGNsaWVudDBjMBwGBiqFAwICEzASBgcqhQMCAiQABgcq\n"
+ "hQMCAh4BA0MABEBuvOEDe9xPJY9jsnFckLyQ6B5XeDi4Wo2E4c05im/3iI+rlWGI\n"
+ "rTc6hMmWca0BVDL0lObZ0ZHb4Vhy0XREgvtro3YwdDAMBgNVHRMBAf8EAjAAMBMG\n"
+ "A1UdJQQMMAoGCCsGAQUFBwMCMA8GA1UdDwEB/wQFAwMHsAAwHQYDVR0OBBYEFCck\n"
+ "yCTDt+A6zS8SnMRrgbyjeQmoMB8GA1UdIwQYMBaAFPmohhljtqQUE2B2DwGaNTbv\n"
+ "8bSvMA0GCSqGSIb3DQEBCwUAA4IBgQACkq/DQhHMEZPL0NwPFpnf2+RDviEuRE+C\n"
+ "xaOMTbHgxIUSy6xQAaHXK5hNr9xk87OFPPXmNKPl1nVBXrDF0aj+YUVBT2QeJIpA\n"
+ "APfyjnPtdZpRl3MXrJbQ/VBCdShvmKhspiOkGO6K8ETDeqE57qtPsUaGApfNK7oL\n"
+ "WgevmnkaQqNTVJglOoB5o5IDNv0JuFEkKSEvCgS25OV+gl0rRHmWDaIdQtDJLQjV\n"
+ "24b99/woYj0Ql8WfvMUUUYqTX03zmV56k5DgoNusTxKG+r71WQwbeb3XiVjof6I7\n"
+ "ll3ANTdyf/KrysLx/tk1pNgfangArpAZzbCRejTQVYdVfCf3KDdwXvKlTHy9Jv+p\n"
+ "ZUSf7kMnBqcUHpbceiyHFCXNAKIdrMDkTJAeee7ktpeYMfdO9oBki+6a8RJjNHIr\n"
+ "wHe0DcExV7UsokG6jMl8kH7gb7EW0UphL3ncWyY8C4jbtf/q1kci6SZDcapXBpGp\n"
+ "adJdx9bycdOUm1cGiboUMMPiCA5bO+Q=\n"
+ "-----END CERTIFICATE-----\n";
+
+static char cligost01_ca3_key_pem[] =
+ "-----BEGIN PRIVATE KEY-----\n"
+ "MEUCAQAwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEEIgQgVPdBJeLrp/Zh\n"
+ "2tiV6qz9N6HraKTFTKz4alNuGhK2iLM=\n"
+ "-----END PRIVATE KEY-----\n";
+
+const gnutls_datum_t cligost01_ca3_key = { (unsigned char*)cligost01_ca3_key_pem,
+ sizeof(cligost01_ca3_key_pem)-1
+};
+
+const gnutls_datum_t cligost01_ca3_cert = { (unsigned char*)cligost01_ca3_cert_pem,
+ sizeof(cligost01_ca3_cert_pem)-1
+};
+
+static char cligost12_256_ca3_cert_pem[] =
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIIC6jCCAVKgAwIBAgIIWcalgS6c0DMwDQYJKoZIhvcNAQELBQAwDzENMAsGA1UE\n"
+ "AxMEQ0EtMzAgFw0xNzA5MjMxODE4NDJaGA85OTk5MTIzMTIzNTk1OVowHzEdMBsG\n"
+ "A1UEAxMUR09TVCAyMDEyLzI1NiBjbGllbnQwZjAfBggqhQMHAQEBATATBgcqhQMC\n"
+ "AiQABggqhQMHAQECAgNDAARArjme5Fb62BC4uPT8vQVim3xTjYY/RVvvUtAfYluY\n"
+ "o+8Zjz8A8VTFejK0Zok5f1dssbzrrHtRODJZsCuAjypIXqN2MHQwDAYDVR0TAQH/\n"
+ "BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAjAPBgNVHQ8BAf8EBQMDB7AAMB0GA1Ud\n"
+ "DgQWBBTzHDVZRnSgaq4M3B7NdLResyKgajAfBgNVHSMEGDAWgBT5qIYZY7akFBNg\n"
+ "dg8BmjU27/G0rzANBgkqhkiG9w0BAQsFAAOCAYEAtAGi0lQdBC9Mp/TdqYFuMIDr\n"
+ "o/xGbie6Eq33BiqXo6B5DOiPZcE1Mi+y4htefvrEBkN4OLy4PbUHlfEC/ATs3X9S\n"
+ "cUHucm6gkyzUxTLPYPfTmXD24MRFDAJQKMvX8Pklbi7HyFZVYIQaJfEohaQZmuYR\n"
+ "S7Z03MW0Cbz6j7LGQl1Pyix78BLKeyLyAzQz63+hCuO46xp7TaGDKGI79Dd6Od0p\n"
+ "oY/B/MxfuP3RXhHrpjgp+Ev08dYoCH3Snps+TYWSyhkN0VhGRJgE5Tnhdly8XMW3\n"
+ "WKZqGYmWG+rBtiTgA6FZrw0qYwAsmN3yCo5pE+Ukd0Q5L0tugc0a9HK53AftG/zV\n"
+ "qf0DI+E4dEnUkVhdEQbW+rujGpAR0sgjgar5Zvwuu92BaV+AFucj7hVP1fqDySmp\n"
+ "E52EzrFcnCYrZb19aDJKgWevG5Vh6OEcu8Vx/zVFOoTx9ZCXniVLm7PaXyKXdhLv\n"
+ "Vhg3mi7koFAPGlTiKldJ/LKKPW0yti3I8L/p2F5+\n"
+ "-----END CERTIFICATE-----\n";
+
+static char cligost12_256_ca3_key_pem[] =
+ "-----BEGIN PRIVATE KEY-----\n"
+ "MEgCAQAwHwYIKoUDBwEBAQEwEwYHKoUDAgIkAAYIKoUDBwEBAgIEIgQgnA1XIfe2\n"
+ "V3D0UVFQTRCHolA9v+r5cDt2tlr1gTZbDC8=\n"
+ "-----END PRIVATE KEY-----\n";
+
+const gnutls_datum_t cligost12_256_ca3_key = { (unsigned char*)cligost12_256_ca3_key_pem,
+ sizeof(cligost12_256_ca3_key_pem)-1
+};
+
+const gnutls_datum_t cligost12_256_ca3_cert = { (unsigned char*)cligost12_256_ca3_cert_pem,
+ sizeof(cligost12_256_ca3_cert_pem)-1
+};
+
+static char cligost12_512_ca3_cert_pem[] =
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIIDLzCCAZegAwIBAgIIWcalYA16syEwDQYJKoZIhvcNAQELBQAwDzENMAsGA1UE\n"
+ "AxMEQ0EtMzAgFw0xNzA5MjMxODE4MDhaGA85OTk5MTIzMTIzNTk1OVowHzEdMBsG\n"
+ "A1UEAxMUR09TVCAyMDEyLzUxMiBjbGllbnQwgaowIQYIKoUDBwEBAQIwFQYJKoUD\n"
+ "BwECAQIBBggqhQMHAQECAwOBhAAEgYCyAdmv9viBTnemLvULAZ9RyaEf37ZAydKj\n"
+ "E3qLbZ5tTxgLAYhIIGApVPVb5SZxge3u2qY/ekkHjz9Asn5cPQ69wCvce87+2u1f\n"
+ "XcATUzYvR3UIL25C5BbNjDjGnufhjYAwT6uZ5xQ7j8/Wfr0MZU04O2CSUquKqfrB\n"
+ "DA81M2HvUqN2MHQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAjAP\n"
+ "BgNVHQ8BAf8EBQMDB7AAMB0GA1UdDgQWBBRYXgWHcQazcPFyxKrgRdfd2IPBozAf\n"
+ "BgNVHSMEGDAWgBT5qIYZY7akFBNgdg8BmjU27/G0rzANBgkqhkiG9w0BAQsFAAOC\n"
+ "AYEAUOpvomUtaFQm5O8bEQk/d3ghZLzwfMKRngSq0XbXDi8t+TV+kFvkzJ/hrAOP\n"
+ "/HPCQdnEvdV2HyZzDb9b8cVegRHPPooKSV8+HCTNVXNKZPRSlE42S5kFIAnAxbs5\n"
+ "vzGfipp6jQe9dqlCYseikxnE31o3AX7QAlNBaXELu0JnEY5BoJeKoja8XS40b1k9\n"
+ "kKRwAGkdh1OcAy6pW8AH4m61RMDWFzmPGgcb0JiDNp+9HQDSkG904niU8AlvmoQD\n"
+ "Q2AVd9mam4NIjmA0hkVuSh+7Tn2XnoGoGxN/+u72qaSUA6ybkbtkIKpMeJ8vciI1\n"
+ "6GRhBYpI0OuRiAIbDA9WhfCCKwj9ZaIsSSHC7qADRz3bR/89Et1mM40v5jbYNDkV\n"
+ "1cvlca3+pK3DxNP7y/q3QoUz8++z9VXzsdVHc4wNUyg4E8mjMcdLlRsZbST0WjX+\n"
+ "IhxAkfOexMu3nJ3EVbjgvox6eIxjiTWr2DP6x666UztrnFSBhhypwKHb8jW7PYJ2\n"
+ "lWlI\n"
+ "-----END CERTIFICATE-----\n";
+
+static char cligost12_512_ca3_key_pem[] =
+ "-----BEGIN PRIVATE KEY-----\n"
+ "MGoCAQAwIQYIKoUDBwEBAQIwFQYJKoUDBwECAQIBBggqhQMHAQECAwRCBEA9uga7\n"
+ "LIPp1heDZYj5EozNtbrmsKYMXrFasBIVAFFVQVFd6/+YjttV6Vmx16OFWrM+/ydX\n"
+ "rB0aUqYPU8w5DUyk\n"
+ "-----END PRIVATE KEY-----\n";
+
+const gnutls_datum_t cligost12_512_ca3_key = { (unsigned char*)cligost12_512_ca3_key_pem,
+ sizeof(cligost12_512_ca3_key_pem)-1
+};
+
+const gnutls_datum_t cligost12_512_ca3_cert = { (unsigned char*)cligost12_512_ca3_cert_pem,
+ sizeof(cligost12_512_ca3_cert_pem)-1
+};
+
static char server_ca3_ecc_key_pem[] =
"-----BEGIN EC PRIVATE KEY-----\n"
"MHgCAQEEIQDn1XFX7QxTKXl2ekfSrEARsq+06ySEeeOB+N0igwcNLqAKBggqhkjO\n"
@@ -975,6 +1086,111 @@ const gnutls_datum_t server_ca3_eddsa_cert = { (unsigned char*)server_ca3_eddsa_
sizeof(server_ca3_eddsa_cert_pem)-1
};
+static char server_ca3_gost01_key_pem[] =
+ "-----BEGIN PRIVATE KEY-----\n"
+ "MEUCAQAwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEEIgQgR1lBLIr4WBpn\n"
+ "4MOCH8oxGWb52EPNL3gjNJiQuBQuf6U=\n"
+ "-----END PRIVATE KEY-----\n";
+
+const gnutls_datum_t server_ca3_gost01_key = { (unsigned char*)server_ca3_gost01_key_pem,
+ sizeof(server_ca3_gost01_key_pem)-1
+};
+
+static char server_ca3_gost01_cert_pem[] =
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIIC7TCCAVWgAwIBAgIIWcZJ7xuHksUwDQYJKoZIhvcNAQELBQAwDzENMAsGA1UE\n"
+ "AxMEQ0EtMzAgFw0xNzA5MjMxMTQ4MDFaGA85OTk5MTIzMTIzNTk1OVowDTELMAkG\n"
+ "A1UEAxMCR1IwYzAcBgYqhQMCAhMwEgYHKoUDAgIkAAYHKoUDAgIeAQNDAARA0Lvp\n"
+ "9MaoYDxzkURVz71Q3Sw9Wrwa2F483xDd0mOID8CK7JY8C8gz/1dfZniUObT1JMa6\n"
+ "hkGsQyFvPLD6Vr1bN6OBjTCBijAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuCCWxv\n"
+ "Y2FsaG9zdDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHQ8BAf8EBQMDBzAAMB0G\n"
+ "A1UdDgQWBBSGUfwGWchcx3r3TNANllOEOFkTWDAfBgNVHSMEGDAWgBT5qIYZY7ak\n"
+ "FBNgdg8BmjU27/G0rzANBgkqhkiG9w0BAQsFAAOCAYEAXrO06eHEXlsbmRgSvCtu\n"
+ "mnXCG6KNI6K4WS411Adj3wLkfURlbLMTT6tBFLRq5EVWQqp867/xk577Rd85yC0P\n"
+ "biNXr0Am2DXEPOJnrmh3D/R8hy5gSozoZM7jfy3D9FK6l2O458teBe1l/aBZL7FW\n"
+ "EbM6W5SMqlDMkcZSa8hSuUHUtcTIbQzGdqkR9y/res8+INsRInpHgVZdEmTls8QM\n"
+ "UoBQMXtRgfAp22HHeCnH1rygTVglujU3SPAVEasKpN+D7ht4x2/M0sqljWmyew1B\n"
+ "ENyJ6fvnjLJLpLLoj3220cM+w7K+N5F2YKPi5POkSJJTUrsjUWpKD+J6V7NzPrYb\n"
+ "VtDA/qn1MJwJvob2L5lDcMPos4mk/HTRWT0MwcBovSGjLpVzrzGgVFdRzlxNDfWj\n"
+ "1qWGbXbdYK4akvQasESIfVu7jBROL9zm2JEGEvJYNMORqFUHczzpVyYhBiX3KCJb\n"
+ "6pd0K2Nq/UXI16aCWEw8hEiVHUwDd+0Qc3NR/DgeFciz\n"
+ "-----END CERTIFICATE-----\n";
+
+const gnutls_datum_t server_ca3_gost01_cert = { (unsigned char*)server_ca3_gost01_cert_pem,
+ sizeof(server_ca3_gost01_cert_pem)-1
+};
+
+static char server_ca3_gost12_256_key_pem[] =
+ "-----BEGIN PRIVATE KEY-----\n"
+ "MEgCAQAwHwYIKoUDBwEBAQEwEwYHKoUDAgIkAAYIKoUDBwEBAgIEIgQg0+JttJEV\n"
+ "Ud+XBzX9q13ByKK+j2b+mEmNIo1yB0wGleo=\n"
+ "-----END PRIVATE KEY-----\n";
+
+const gnutls_datum_t server_ca3_gost12_256_key = { (unsigned char*)server_ca3_gost12_256_key_pem,
+ sizeof(server_ca3_gost12_256_key_pem)-1
+};
+
+static char server_ca3_gost12_256_cert_pem[] =
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIIC8DCCAVigAwIBAgIIWcZKgxkCMvcwDQYJKoZIhvcNAQELBQAwDzENMAsGA1UE\n"
+ "AxMEQ0EtMzAgFw0xNzA5MjMxMTUwMjhaGA85OTk5MTIzMTIzNTk1OVowDTELMAkG\n"
+ "A1UEAxMCR1IwZjAfBggqhQMHAQEBATATBgcqhQMCAiQABggqhQMHAQECAgNDAARA\n"
+ "J9sMEEx0JW9QsT5bDqyc0TNcjVg9ZSdp4GkMtShM+OOgyBGrWK3zLP5IzHYSXja8\n"
+ "373QrJOUvdX7T7TUk5yU5aOBjTCBijAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuC\n"
+ "CWxvY2FsaG9zdDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHQ8BAf8EBQMDBzAA\n"
+ "MB0GA1UdDgQWBBQYSEtdwsYrtnOq6Ya3nt8DgFPCQjAfBgNVHSMEGDAWgBT5qIYZ\n"
+ "Y7akFBNgdg8BmjU27/G0rzANBgkqhkiG9w0BAQsFAAOCAYEAikKRQ2s/mldqX1eX\n"
+ "DGXdQZs6S/RXywYCKYTr683TvXF5b3O80pM/kdwvD9/0LQhF/kkHawjGTEj6RbYe\n"
+ "rsAc3HQFq9AGrllin18nPRkVaOkxZQot5plfMBdJ6GVoe6shWejShZubDWsEmuoQ\n"
+ "jPW2P9lBbEuOuet0XLd5+uaoVmjPGpKaneWQxGyfT0eEfKVj+89zdX8MAf9aoEJf\n"
+ "RZulc73W91v51cX2zxnpA9u2XODMfBQIItAzi5+7jTzAExMFmx8dkzx+tM7D3Htr\n"
+ "/6Xajc2j6NnLmT56e+MAmEpf4AP7XdIVhyPvRIpW8V+bIvaFxo2XUKBipU9DarCi\n"
+ "o/0x8x4UaKlKQ8SkyppE2nDK98rPyObyWb6l5IN3fjv2XBjcwTz+t/SzzfHJNY7I\n"
+ "3I9J5vlWIG94FQn8Tj9vQ4swcNotVM74koaV7ZYWJm2mhZirVHwYBa3joHSVEs0u\n"
+ "m53rVbR+3MyzmsVtKIbqg76Tcf2Nm/cs+amFNCmB4vgcKhHO\n"
+ "-----END CERTIFICATE-----\n";
+
+const gnutls_datum_t server_ca3_gost12_256_cert = { (unsigned char*)server_ca3_gost12_256_cert_pem,
+ sizeof(server_ca3_gost12_256_cert_pem)-1
+};
+
+static char server_ca3_gost12_512_key_pem[] =
+ "-----BEGIN PRIVATE KEY-----\n"
+ "MGoCAQAwIQYIKoUDBwEBAQIwFQYJKoUDBwECAQIBBggqhQMHAQECAwRCBECS7bAh\n"
+ "TP5um5bxziaKkhb6xSI5WBQCSlaiHPBaMbgmgJiF8RubF7k0YMefpt0+sA3GvVGA\n"
+ "KjL7CLBERDm7Yvlv\n"
+ "-----END PRIVATE KEY-----\n";
+
+const gnutls_datum_t server_ca3_gost12_512_key = { (unsigned char*)server_ca3_gost12_512_key_pem,
+ sizeof(server_ca3_gost12_512_key_pem)-1
+};
+
+static char server_ca3_gost12_512_cert_pem[] =
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIIDNTCCAZ2gAwIBAgIIWcZKvSvigz0wDQYJKoZIhvcNAQELBQAwDzENMAsGA1UE\n"
+ "AxMEQ0EtMzAgFw0xNzA5MjMxMTUxMjZaGA85OTk5MTIzMTIzNTk1OVowDTELMAkG\n"
+ "A1UEAxMCR1IwgaowIQYIKoUDBwEBAQIwFQYJKoUDBwECAQIBBggqhQMHAQECAwOB\n"
+ "hAAEgYAyMiKX4UdLpmVkJehhIY44Y2enFpWCeNSR6OocfHC8R6KTo0qxxEEcWm53\n"
+ "yNO3vSI5StDGbqEvJ4H28gBCNC8nIIjoA064jvJddDRDP2K9ZfgOah7GfToeOoo1\n"
+ "JT00+lhGcyv8lEUJo4NE0BUFD0K8En5FvJSc2yDcGhwllqkncaOBjTCBijAMBgNV\n"
+ "HRMBAf8EAjAAMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDATBgNVHSUEDDAKBggrBgEF\n"
+ "BQcDATAPBgNVHQ8BAf8EBQMDBzAAMB0GA1UdDgQWBBTzbWGJHENCLWA8WBZ5nIN5\n"
+ "xgOWfDAfBgNVHSMEGDAWgBT5qIYZY7akFBNgdg8BmjU27/G0rzANBgkqhkiG9w0B\n"
+ "AQsFAAOCAYEAi6XPIwiObZWVZbKPavY0itehtVC+c2jVoMMEToAfUx0w8zVGgCI9\n"
+ "bAN3/ONIZqXZ4m4n1zOz7xoWyCSZ34EnHPLyDsxvtFDJf5jasVGpOe3hPAnk56OY\n"
+ "D8SI5g6KI9yp0ZGjA1Q10u8pR7XJWAhySfbcLBZCHqi+okO91za9wTUIz3sXjchI\n"
+ "3WZSIqttT3sx3K1RfvFENXLQm+ctim08CJsA1kmUO4i4nU7KvG4thMW7GERZOi+L\n"
+ "F00WtDvSv5yDeuNyfB2GUZU1fMfkLzJk6qlzPY3Tfs4+x87F2TToC8zI9xf6ykin\n"
+ "edg9NbHMV4o4fGb81G9I1iQ7W1E9wDsQ3ZPl65q3L+pV9Vi7fw87AxrD8ccyLi30\n"
+ "C7HeG4LrIa6PQwTKSUwHayIkHCEG66Q5Tx6MK4qMYsNFCRsesKfEAfo1ZsHNcL1u\n"
+ "t8spicVYd8Z8nIH1y31KxUmoHzsTzHHrkBj70C1QCgw0l0HqzGpoFutJOxSoAG1/\n"
+ "W/XeciR4jbN5\n"
+ "-----END CERTIFICATE-----\n";
+
+const gnutls_datum_t server_ca3_gost12_512_cert = { (unsigned char*)server_ca3_gost12_512_cert_pem,
+ sizeof(server_ca3_gost12_512_cert_pem)-1
+};
+
/* shares server_ca3 key */
static char server_localhost6_ca3_cert_pem[] =
"-----BEGIN CERTIFICATE-----\n"
diff --git a/tests/cert-tests/Makefile.am b/tests/cert-tests/Makefile.am
index 150681e325..ff38b23bc4 100644
--- a/tests/cert-tests/Makefile.am
+++ b/tests/cert-tests/Makefile.am
@@ -43,7 +43,8 @@ EXTRA_DIST = data/ca-no-pathlen.pem data/no-ca-or-pathlen.pem data/aki-cert.pem
data/template-krb5name.pem data/template-krb5name-full.pem data/template-test-ecc.key \
data/template-rsa-sha3-256.pem data/template-rsa-sha3-512.pem data/template-rsa-sha3-224.pem \
data/template-rsa-sha3-384.pem data/long-oids.pem \
- data/name-constraints-ip2.pem data/chain-md5.pem data/gost-cert.pem \
+ data/name-constraints-ip2.pem data/chain-md5.pem \
+ data/gost-cert.pem data/gost-cert-nogost.pem data/gost94-cert.pem \
templates/template-tlsfeature.tmpl data/userid.pem data/cert-with-crl.p12 \
data/template-tlsfeature.pem data/template-tlsfeature.csr \
templates/template-tlsfeature-crq.tmpl templates/arb-extensions.tmpl data/arb-extensions.pem \
@@ -89,7 +90,8 @@ EXTRA_DIST = data/ca-no-pathlen.pem data/no-ca-or-pathlen.pem data/aki-cert.pem
data/pkcs8-pbes1-des-md5.pem data/pkcs8-invalid8.der data/key-invalid1.der \
data/key-invalid4.der data/key-invalid5.der data/key-invalid6.der \
data data/pkcs8-invalid9.der data/key-invalid2.der data/pkcs8-invalid10.der \
- data/key-invalid3.der data/pkcs8-eddsa.pem data/pkcs8-eddsa.pem.txt
+ data/key-invalid3.der data/pkcs8-eddsa.pem data/pkcs8-eddsa.pem.txt \
+ data/rfc4490.p7b data/rfc4490.p7b.out data/gost01.p12 data/gost12.p12 data/gost12-2.p12
dist_check_SCRIPTS = pathlen aki invalid-sig email \
pkcs7 pkcs7-broken-sigs privkey-import name-constraints certtool-long-cn crl provable-privkey \
@@ -118,6 +120,13 @@ if ENABLE_DANE
dist_check_SCRIPTS += dane
endif
+if ENABLE_GOST
+dist_check_SCRIPTS += gost
+if !WINDOWS
+dist_check_SCRIPTS += pkcs12-gost
+endif
+endif
+
dist_check_SCRIPTS += certtool-rsa-pss certtool-eddsa
TESTS = $(dist_check_SCRIPTS)
@@ -141,5 +150,11 @@ if WINDOWS
TESTS_ENVIRONMENT += WINDOWS=1
endif
+if ENABLE_GOST
+TESTS_ENVIRONMENT += ENABLE_GOST=1
+else
+TESTS_ENVIRONMENT += ENABLE_GOST=0
+endif
+
distclean-local:
rm -rf tmp-* *.tmp
diff --git a/tests/cert-tests/data/gost-cert-nogost.pem b/tests/cert-tests/data/gost-cert-nogost.pem
new file mode 100644
index 0000000000..bf280349fd
--- /dev/null
+++ b/tests/cert-tests/data/gost-cert-nogost.pem
@@ -0,0 +1,45 @@
+X.509 Certificate Information:
+ Version: 3
+ Serial Number (hex): 011f
+ Issuer: CN=SuperPlat CA 01,OU=SuperPlat CA,O=SuperPlat,L=Moscow,ST=Russia,C=RU
+ Validity:
+ Not Before: Fri Aug 17 06:47:36 UTC 2012
+ Not After: Sat Aug 17 06:47:36 UTC 2013
+ Subject: CN=SuperTerm0000001,OU=SuperPlat Terminals,O=SuperPlat,L=Moscow,ST=Russia,C=RU
+ Subject Public Key Algorithm: GOST R 34.10-2001
+ Extensions:
+ Basic Constraints (not critical):
+ Certificate Authority (CA): FALSE
+ Unknown extension 2.16.840.1.113730.1.13 (not critical):
+ ASCII: ..OpenSSL Generated Certificate
+ Hexdump: 161d4f70656e53534c2047656e657261746564204365727469666963617465
+ Subject Key Identifier (not critical):
+ 43fe227895724f4e3a74f264e4fd0b800c082e03
+ Authority Key Identifier (not critical):
+ 9875a3b785c1641b23344d9bfbae0c2a256b44eb
+ Signature Algorithm: GOSTR341001
+ Signature:
+ 8f:37:24:fd:be:f0:37:d9:f3:1a:5c:31:5e:33:ef:35
+ 61:93:07:03:3d:4d:e8:2c:1b:39:a2:6c:d4:2f:85:35
+ b2:43:1d:ed:b5:15:45:c7:10:38:41:28:68:29:62:20
+ e6:92:8a:64:34:87:b8:b9:9f:ab:c8:04:6d:26:55:99
+Other Information:
+ Fingerprint:
+ sha1:621f34c4fdd7e93f9b8f18224ba0bcd1c63a4771
+ sha256:ac6ecf4e7a876edf3e61f538d6061353c2015bfbdf60370492f7404d7f09e13a
+
+-----BEGIN CERTIFICATE-----
+MIICXjCCAgugAwIBAgICAR8wCgYGKoUDAgIDBQAwdDELMAkGA1UEBhMCUlUxDzAN
+BgNVBAgMBlJ1c3NpYTEPMA0GA1UEBwwGTW9zY293MRIwEAYDVQQKDAlTdXBlclBs
+YXQxFTATBgNVBAsMDFN1cGVyUGxhdCBDQTEYMBYGA1UEAwwPU3VwZXJQbGF0IENB
+IDAxMB4XDTEyMDgxNzA2NDczNloXDTEzMDgxNzA2NDczNlowfDELMAkGA1UEBhMC
+UlUxDzANBgNVBAgMBlJ1c3NpYTEPMA0GA1UEBwwGTW9zY293MRIwEAYDVQQKDAlT
+dXBlclBsYXQxHDAaBgNVBAsME1N1cGVyUGxhdCBUZXJtaW5hbHMxGTAXBgNVBAMM
+EFN1cGVyVGVybTAwMDAwMDEwYzAcBgYqhQMCAhMwEgYHKoUDAgIjAQYHKoUDAgIe
+AQNDAARA69rbaWL2GSV1NVaWMSrWRX8d/frrwbVjJerPQKjyNeDYZxgSjTTp3dck
+6fQLx2OjQsu6n+vdyBPQex/iwbJBV6N7MHkwCQYDVR0TBAIwADAsBglghkgBhvhC
+AQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFEP+
+IniVck9OOnTyZOT9C4AMCC4DMB8GA1UdIwQYMBaAFJh1o7eFwWQbIzRNm/uuDCol
+a0TrMAoGBiqFAwICAwUAA0EAjzck/b7wN9nzGlwxXjPvNWGTBwM9TegsGzmibNQv
+hTWyQx3ttRVFxxA4QShoKWIg5pKKZDSHuLmfq8gEbSZVmQ==
+-----END CERTIFICATE-----
diff --git a/tests/cert-tests/data/gost-cert.pem b/tests/cert-tests/data/gost-cert.pem
index edcdb9e8a6..1501f83c4c 100644
--- a/tests/cert-tests/data/gost-cert.pem
+++ b/tests/cert-tests/data/gost-cert.pem
@@ -6,7 +6,18 @@ X.509 Certificate Information:
Not Before: Fri Aug 17 06:47:36 UTC 2012
Not After: Sat Aug 17 06:47:36 UTC 2013
Subject: CN=SuperTerm0000001,OU=SuperPlat Terminals,O=SuperPlat,L=Moscow,ST=Russia,C=RU
- Subject Public Key Algorithm: 1.2.643.2.2.19
+ Subject Public Key Algorithm: GOST R 34.10-2001
+ Algorithm Security Level: High (256 bits)
+ Curve: CryptoPro-A
+ Digest: GOSTR341194
+ ParamSet: CryptoPro-A
+ X:
+ 00:e0:35:f2:a8:40:cf:ea:25:63:b5:c1:eb:fa:fd:1d
+ 7f:45:d6:2a:31:96:56:35:75:25:19:f6:62:69:db:da
+ eb
+ Y:
+ 57:41:b2:c1:e2:1f:7b:d0:13:c8:dd:eb:9f:ba:cb:42
+ a3:63:c7:0b:f4:e9:24:d7:dd:e9:34:8d:12:18:67:d8
Extensions:
Basic Constraints (not critical):
Certificate Authority (CA): FALSE
@@ -17,7 +28,7 @@ X.509 Certificate Information:
43fe227895724f4e3a74f264e4fd0b800c082e03
Authority Key Identifier (not critical):
9875a3b785c1641b23344d9bfbae0c2a256b44eb
- Signature Algorithm: 1.2.643.2.2.3
+ Signature Algorithm: GOSTR341001
Signature:
8f:37:24:fd:be:f0:37:d9:f3:1a:5c:31:5e:33:ef:35
61:93:07:03:3d:4d:e8:2c:1b:39:a2:6c:d4:2f:85:35
@@ -27,6 +38,11 @@ Other Information:
Fingerprint:
sha1:621f34c4fdd7e93f9b8f18224ba0bcd1c63a4771
sha256:ac6ecf4e7a876edf3e61f538d6061353c2015bfbdf60370492f7404d7f09e13a
+ Public Key ID:
+ sha1:43757042dae9e9f5fa92cc2d2cbf4950f28a7bd0
+ sha256:cee4a59e7803bafb101af8e39e5355d7895e3b85e7616fe624d48f2c51e8bdbf
+ Public Key PIN:
+ pin-sha256:zuSlnngDuvsQGvjjnlNV14leO4XnYW/mJNSPLFHovb8=
-----BEGIN CERTIFICATE-----
MIICXjCCAgugAwIBAgICAR8wCgYGKoUDAgIDBQAwdDELMAkGA1UEBhMCUlUxDzAN
diff --git a/tests/cert-tests/data/gost01.p12 b/tests/cert-tests/data/gost01.p12
new file mode 100644
index 0000000000..1420fbc69a
--- /dev/null
+++ b/tests/cert-tests/data/gost01.p12
Binary files differ
diff --git a/tests/cert-tests/data/gost12-2.p12 b/tests/cert-tests/data/gost12-2.p12
new file mode 100644
index 0000000000..d7b7a6249c
--- /dev/null
+++ b/tests/cert-tests/data/gost12-2.p12
Binary files differ
diff --git a/tests/cert-tests/data/gost12.p12 b/tests/cert-tests/data/gost12.p12
new file mode 100644
index 0000000000..d7b7a6249c
--- /dev/null
+++ b/tests/cert-tests/data/gost12.p12
Binary files differ
diff --git a/tests/cert-tests/data/gost94-cert.pem b/tests/cert-tests/data/gost94-cert.pem
new file mode 100644
index 0000000000..f4d63fb9d1
--- /dev/null
+++ b/tests/cert-tests/data/gost94-cert.pem
@@ -0,0 +1,33 @@
+X.509 Certificate Information:
+ Version: 1
+ Serial Number (hex): 230ee360469524cec70be494182e7eeb
+ Issuer: EMAIL=GostR3410-94@example.com,C=RU,O=CryptoPro,CN=GostR3410-94 example
+ Validity:
+ Not Before: Tue Aug 16 12:32:50 UTC 2005
+ Not After: Sun Aug 16 12:32:50 UTC 2015
+ Subject: EMAIL=GostR3410-94@example.com,C=RU,O=CryptoPro,CN=GostR3410-94 example
+ Subject Public Key Algorithm: 1.2.643.2.2.20
+ Signature Algorithm: 1.2.643.2.2.4
+ Signature:
+ 11:c7:08:7e:12:dc:02:f1:02:23:29:47:76:8f:47:2a
+ 81:83:50:e3:07:cc:f2:e4:31:23:89:42:c8:73:e1:de
+ 22:f7:85:f3:55:bd:94:ec:46:91:9c:67:ac:58:d7:05
+ 2a:a7:8c:b7:85:2a:01:75:85:f7:d7:38:03:fb:cd:43
+Other Information:
+ Fingerprint:
+ sha1:d43782a1f943a966f4ea1ac96bd048fe68d4d951
+ sha256:19260c765a2c820be3612dc0431c045d37570f8e4de58ba218f10a8eeb0d42d7
+
+-----BEGIN CERTIFICATE-----
+MIICCzCCAboCECMO42BGlSTOxwvklBgufuswCAYGKoUDAgIEMGkxHTAbBgNVBAMM
+FEdvc3RSMzQxMC05NCBleGFtcGxlMRIwEAYDVQQKDAlDcnlwdG9Qcm8xCzAJBgNV
+BAYTAlJVMScwJQYJKoZIhvcNAQkBFhhHb3N0UjM0MTAtOTRAZXhhbXBsZS5jb20w
+HhcNMDUwODE2MTIzMjUwWhcNMTUwODE2MTIzMjUwWjBpMR0wGwYDVQQDDBRHb3N0
+UjM0MTAtOTQgZXhhbXBsZTESMBAGA1UECgwJQ3J5cHRvUHJvMQswCQYDVQQGEwJS
+VTEnMCUGCSqGSIb3DQEJARYYR29zdFIzNDEwLTk0QGV4YW1wbGUuY29tMIGlMBwG
+BiqFAwICFDASBgcqhQMCAiACBgcqhQMCAh4BA4GEAASBgLuEZuF5nls02CyAfxOo
+GWZxV/6MVCUhR28wCyd3RpjG+0dVvrey85NsObVCNyaE4g0QiiQOHwxCTSs7ESuo
+v2Y5MlyUi8Go/htjEvYJJYfMdRv05YmKCYJo01x3pg+2kBATjeM+fJyR1qwNCCw+
+eMG1wra3Gqgqi0WBkzIydvp7MAgGBiqFAwICBANBABHHCH4S3ALxAiMpR3aPRyqB
+g1DjB8zy5DEjiULIc+HeIveF81W9lOxGkZxnrFjXBSqnjLeFKgF1hffXOAP7zUM=
+-----END CERTIFICATE-----
diff --git a/tests/cert-tests/data/rfc4490.p7b b/tests/cert-tests/data/rfc4490.p7b
new file mode 100644
index 0000000000..c6979804b8
--- /dev/null
+++ b/tests/cert-tests/data/rfc4490.p7b
Binary files differ
diff --git a/tests/cert-tests/data/rfc4490.p7b.out b/tests/cert-tests/data/rfc4490.p7b.out
new file mode 100644
index 0000000000..8237d70359
--- /dev/null
+++ b/tests/cert-tests/data/rfc4490.p7b.out
@@ -0,0 +1,14 @@
+Signers:
+ Signer's issuer DN: EMAIL=GostR3410-2001@example.com,C=RU,O=CryptoPro,CN=GostR3410-2001 example
+ Signer's serial: 2bf5c61ec211bd17c7dcd46266b42e21
+ Signature Algorithm: GOSTR341001
+
+-----BEGIN PKCS7-----
+MIIBKAYJKoZIhvcNAQcCoIIBGTCCARUCAQExDDAKBgYqhQMCAgkFADAbBgkqhkiG
+9w0BBwGgDgQMc2FtcGxlIHRleHQKMYHkMIHhAgEBMIGBMG0xHzAdBgNVBAMMFkdv
+c3RSMzQxMC0yMDAxIGV4YW1wbGUxEjAQBgNVBAoMCUNyeXB0b1BybzELMAkGA1UE
+BhMCUlUxKTAnBgkqhkiG9w0BCQEWGkdvc3RSMzQxMC0yMDAxQGV4YW1wbGUuY29t
+AhAr9cYewhG9F8fc1GJmtC4hMAoGBiqFAwICCQUAMAoGBiqFAwICEwUABEDAw0LZ
+P4/+JRERiHe/icPbg0IE1iD5aCqZ9v4wO+T0yPjVtNr74caRZzQfvKZ6DRJ7/RAl
+xlHbjbL0jHF+7XKp
+-----END PKCS7-----
diff --git a/tests/cert-tests/gost b/tests/cert-tests/gost
new file mode 100755
index 0000000000..885c2fa5c7
--- /dev/null
+++ b/tests/cert-tests/gost
@@ -0,0 +1,103 @@
+#!/bin/sh
+
+# Copyright (C) 2016-2017 Free Software Foundation, Inc.
+#
+# Author: Dmitry Eremin-Solenikov
+#
+# This file is part of GnuTLS.
+#
+# The GnuTLS is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>
+
+#set -e
+
+srcdir="${srcdir:-.}"
+CERTTOOL="${CERTTOOL:-../../src/certtool${EXEEXT}}"
+TMPFILE=gost.$$.tmp
+TMPCA=gost-ca.$$.tmp
+TMPCAKEY=gost-ca-key.$$.tmp
+TMPSUBCA=gost-subca.$$.tmp
+TMPSUBCAKEY=gost-subca-key.$$.tmp
+TMPKEY=gost-key.$$.tmp
+TMPTEMPL=template.$$.tmp
+TMPUSER=user.$$.tmp
+VERIFYOUT=verify.$$.tmp
+
+if ! test -x "${CERTTOOL}"; then
+ exit 77
+fi
+
+if test "${GNUTLS_FORCE_FIPS_MODE}" = 1;then
+ echo "Cannot run in FIPS140-2 mode"
+ exit 77
+fi
+
+echo ca > $TMPTEMPL
+echo "cn = GOST STREEBOG 256 CA" >> $TMPTEMPL
+
+"${CERTTOOL}" --generate-privkey --key-type gost12-512 --curve TC26-512-A > $TMPCAKEY 2>/dev/null
+#"${CERTTOOL}" --generate-privkey --key-type gost12-256 --curve CryptoPro-XchA > $TMPCAKEY 2>/dev/null
+
+"${CERTTOOL}" -d 2 --generate-self-signed --template $TMPTEMPL \
+ --load-privkey $TMPCAKEY \
+ --outfile $TMPCA \
+ >$TMPFILE 2>&1
+
+if [ $? != 0 ]; then
+ cat $TMPFILE
+ exit 1
+fi
+
+echo ca > $TMPTEMPL
+"${CERTTOOL}" --generate-privkey --key-type gost12-256 --curve CryptoPro-A > $TMPSUBCAKEY 2>/dev/null
+echo "cn = GOST STREEBOG-256 Mid CA" >> $TMPTEMPL
+
+"${CERTTOOL}" -d 2 --generate-certificate --template $TMPTEMPL \
+ --load-ca-privkey $TMPCAKEY \
+ --load-ca-certificate $TMPCA \
+ --load-privkey $TMPSUBCAKEY \
+ --outfile $TMPSUBCA \
+ >$TMPFILE 2>&1
+
+if [ $? != 0 ]; then
+ cat $TMPFILE
+ exit 1
+fi
+
+echo "cn = End-user" > $TMPTEMPL
+
+"${CERTTOOL}" --generate-privkey --key-type gost01 --curve CryptoPro-XchA > $TMPKEY 2>/dev/null
+
+"${CERTTOOL}" -d 2 --generate-certificate --template $TMPTEMPL \
+ --load-ca-privkey $TMPSUBCAKEY \
+ --load-ca-certificate $TMPSUBCA \
+ --load-privkey $TMPKEY \
+ --outfile $TMPUSER >$TMPFILE 2>&1
+
+if [ $? != 0 ]; then
+ cat $TMPFILE
+ exit 1
+fi
+
+cat $TMPUSER $TMPSUBCA $TMPCA > $TMPFILE
+"${CERTTOOL}" --verify-chain <$TMPFILE > $VERIFYOUT
+
+if [ $? != 0 ]; then
+ cat $VERIFYOUT
+ exit 1
+fi
+
+rm -f $VERIFYOUT $TMPUSER $TMPCA $TMPSUBCA $TMPTEMPL $TMPFILE
+rm -f $TMPSUBCAKEY $TMPCAKEY $TMPKEY
+
+exit 0
diff --git a/tests/cert-tests/pem-decoding b/tests/cert-tests/pem-decoding
index a31f412b48..0222ae72af 100755
--- a/tests/cert-tests/pem-decoding
+++ b/tests/cert-tests/pem-decoding
@@ -124,7 +124,13 @@ fi
#check whether the cert with GOST parameters is decoded as expected
-${VALGRIND} "${CERTTOOL}" --certificate-info --infile "${srcdir}/data/gost-cert.pem" >${TMPFILE}
+if test "${ENABLE_GOST}" = "1"; then
+ GOSTCERT="${srcdir}/data/gost-cert.pem"
+else
+ GOSTCERT="${srcdir}/data/gost-cert-nogost.pem"
+fi
+
+${VALGRIND} "${CERTTOOL}" --certificate-info --infile "${GOSTCERT}" >${TMPFILE}
rc=$?
if test "${rc}" != "0"; then
@@ -132,7 +138,7 @@ if test "${rc}" != "0"; then
exit ${rc}
fi
-${DIFF} -I 'Algorithm Security Level' ${TMPFILE} "${srcdir}/data/gost-cert.pem" || ${DIFF} -I 'Algorithm Security Level' --strip-trailing-cr "${TMPFILE}" "${srcdir}/data/gost-cert.pem"
+${DIFF} -u ${TMPFILE} "${GOSTCERT}" || ${DIFF} -u --strip-trailing-cr "${TMPFILE}" "${GOSTCERT}"
rc=$?
if test "${rc}" != "0"; then
@@ -140,6 +146,23 @@ if test "${rc}" != "0"; then
exit ${rc}
fi
+#check whether the cert with GOST 31.10/11-94 parameters is decoded as expected
+${VALGRIND} "${CERTTOOL}" --certificate-info --infile "${srcdir}/data/gost94-cert.pem" >${TMPFILE}
+rc=$?
+
+if test "${rc}" != "0"; then
+ echo "GOST94 cert decoding failed 1"
+ exit ${rc}
+fi
+
+${DIFF} -I 'Algorithm Security Level' ${TMPFILE} "${srcdir}/data/gost94-cert.pem" || ${DIFF} -I 'Algorithm Security Level' --strip-trailing-cr "${TMPFILE}" "${srcdir}/data/gost94-cert.pem"
+rc=$?
+
+if test "${rc}" != "0"; then
+ echo "GOST94 cert decoding failed 2"
+ exit ${rc}
+fi
+
${VALGRIND} "${CERTTOOL}" --certificate-info --infile "${srcdir}/data/multi-value-dn.pem" >${TMPFILE}
rc=$?
diff --git a/tests/cert-tests/pkcs12-gost b/tests/cert-tests/pkcs12-gost
new file mode 100755
index 0000000000..ee9318f750
--- /dev/null
+++ b/tests/cert-tests/pkcs12-gost
@@ -0,0 +1,86 @@
+#!/bin/sh
+
+# Copyright (C) 2018 Dmitry Eremin-Solenikov
+# Copyright (C) 2016 Red Hat, Inc.
+#
+# This file is part of GnuTLS.
+#
+# GnuTLS is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at
+# your option) any later version.
+#
+# GnuTLS is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GnuTLS; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# This test cannot run under windows because it passes UTF8 data on command
+# line. This seems not to work under windows.
+
+srcdir="${srcdir:-.}"
+CERTTOOL="${CERTTOOL:-../../src/certtool${EXEEXT}}"
+
+if ! test -x "${CERTTOOL}"; then
+ exit 77
+fi
+
+if ! test -z "${VALGRIND}"; then
+ VALGRIND="${LIBTOOL:-libtool} --mode=execute ${VALGRIND} --error-exitcode=1"
+fi
+
+DIFF="${DIFF:-diff}"
+DEBUG=""
+
+TMPFILE=pkcs12-gost.$$.tmp
+TMPFILE_PEM=pkcs12-gost.$$.tmp.pem
+
+echo "Testing decoding of known keys"
+echo "=============================="
+
+ret=0
+for p12 in "gost01.p12 Пароль%20для%20PFX" "gost12.p12 Пароль%20для%20PFX" "gost12-2.p12 Пароль%20для%20PFX" ; do
+ set -- ${p12}
+ file="$1"
+ passwd=$(echo $2|sed 's/%20/ /g')
+
+ if test "x$DEBUG" != "x"; then
+ ${VALGRIND} "${CERTTOOL}" -d 99 --p12-info --inder --password "${passwd}" \
+ --infile "${srcdir}/data/${file}"
+ else
+ ${VALGRIND} "${CERTTOOL}" --p12-info --inder --password "${passwd}" \
+ --infile "${srcdir}/data/${file}" >/dev/null
+ fi
+ rc=$?
+ if test ${rc} != 0; then
+ echo "PKCS12 FATAL ${p12}"
+ exit 1
+ fi
+done
+
+
+echo ""
+echo "Testing encoding/decoding"
+echo "========================="
+
+${VALGRIND} "${CERTTOOL}" --pkcs-cipher=gost28147-tc26z --hash streebog-256 --to-p12 --password "Пароль для PFX" --p12-name "my-key" --load-certificate "${srcdir}/../certs/cert-ecc256.pem" --load-privkey "${srcdir}/../certs/ecc256.pem" --load-ca-certificate "${srcdir}/../certs/ca-cert-ecc.pem" --outder --outfile $TMPFILE >/dev/null
+rc=$?
+if test ${rc} != 0; then
+ echo "PKCS12 FATAL encoding"
+ exit 1
+fi
+
+${VALGRIND} "${CERTTOOL}" --p12-info --inder --password "Пароль для PFX" --infile $TMPFILE >${TMPFILE_PEM} 2>/dev/null
+rc=$?
+if test ${rc} != 0; then
+ echo "PKCS12 FATAL decrypting/decoding"
+ exit 1
+fi
+
+rm -f "$TMPFILE" "$TMPFILE_PEM"
+
+exit 0
diff --git a/tests/cert-tests/pkcs7 b/tests/cert-tests/pkcs7
index 9f6d59b0c1..c9ce1e4d27 100755
--- a/tests/cert-tests/pkcs7
+++ b/tests/cert-tests/pkcs7
@@ -39,7 +39,14 @@ OUTFILE2=out2-pkcs7.$$.tmp
check_for_datefudge
-for FILE in single-ca.p7b full.p7b openssl.p7b openssl-keyid.p7b; do
+if test "${ENABLE_GOST}" = "1" && test "${GNUTLS_FORCE_FIPS_MODE}" != "1"
+then
+ GOST_P7B="rfc4490.p7b"
+else
+ GOST_P7B=""
+fi
+
+for FILE in single-ca.p7b full.p7b openssl.p7b openssl-keyid.p7b $GOST_P7B; do
${VALGRIND} "${CERTTOOL}" --inder --p7-info --infile "${srcdir}/data/${FILE}"|grep -v "Signing time" >"${OUTFILE}"
rc=$?
@@ -283,6 +290,27 @@ if test "${rc}" != "0"; then
exit ${rc}
fi
+if test "x$ENABLE_GOST" = "x1" && test "x${GNUTLS_FORCE_FIPS_MODE}" != "x1"
+then
+ FILE="gost01-signing"
+ ${VALGRIND} "${CERTTOOL}" --p7-sign --load-privkey "${srcdir}/../../doc/credentials/x509/key-gost01.pem" --load-certificate "${srcdir}/../../doc/credentials/x509/cert-gost01.pem" --infile "${srcdir}/data/pkcs7-detached.txt" >"${OUTFILE}"
+ rc=$?
+
+ if test "${rc}" != "0"; then
+ echo "${FILE}: PKCS7 struct signing failed"
+ exit ${rc}
+ fi
+
+ FILE="gost01-signing-verify"
+ ${VALGRIND} "${CERTTOOL}" --p7-verify --load-certificate "${srcdir}/../../doc/credentials/x509/cert-gost01.pem" <"${OUTFILE}"
+ rc=$?
+
+ if test "${rc}" != "0"; then
+ echo "${FILE}: PKCS7 struct signing failed verification"
+ exit ${rc}
+ fi
+fi
+
rm -f "${OUTFILE}"
rm -f "${OUTFILE2}"
diff --git a/tests/chainverify.c b/tests/chainverify.c
index 585c52cdd8..143465cf10 100644
--- a/tests/chainverify.c
+++ b/tests/chainverify.c
@@ -88,6 +88,12 @@ void doit(void)
printf("[%d]: Chain '%s'...\n", (int)i, chains[i].name);
+ if (chains[i].notfips && gnutls_fips140_mode_enabled()) {
+ if (debug)
+ printf("Skipping in FIPS mode...\n");
+ continue;
+ }
+
for (j = 0; chains[i].chain[j]; j++) {
if (debug > 2)
printf("\tAdding certificate %d...", (int)j);
diff --git a/tests/key-import-export.c b/tests/key-import-export.c
index 70febb49ff..a9cb17a257 100644
--- a/tests/key-import-export.c
+++ b/tests/key-import-export.c
@@ -87,6 +87,10 @@ unsigned char false_ed25519_x[] = "\xac\xac\x9a\xb3\xc3\x41\x8d\x41\x22\x21\xc1\
unsigned char ed25519_x[] = "\xab\xaf\x98\xb3\xc3\x41\x8d\x41\x22\x21\xc1\x86\xa7\xb8\x70\xfb\x44\x6e\xc7\x7e\x20\x87\x7b\xd9\x22\xa4\x5d\xd2\x97\x09\xd5\x48";
unsigned char ed25519_k[] = "\x1c\xa9\x23\xdc\x35\xa8\xfd\xd6\x2d\xa8\x98\xb9\x60\x7b\xce\x10\x3d\xf4\x64\xc6\xe5\x4b\x0a\x65\x56\x6a\x3c\x73\x65\x51\xa2\x2f";
+unsigned char gost_x[] = "\x00\xc0\x0f\x88\x63\xd2\xdd\x10\xdf\x3c\x5e\xd8\x1a\xbc\x5a\x3d\x2c\xdd\x50\xbd\xcf\x55\x44\x91\x73\x3c\x60\xa8\xc6\xf4\xe9\xbb\xd0";
+unsigned char gost_y[] = "\x37\x5b\xbd\x56\xfa\xb0\x3c\x6f\x21\x43\xac\x41\x86\xba\xc6\x24\xf5\xb4\x39\x94\x78\x66\x5f\x57\xff\x33\xc8\x0b\x3c\x96\xec\x8a";
+unsigned char gost_k[] = "\x00\xa5\x7f\x2e\x14\xb8\x90\x98\x34\x23\x78\x2f\xcd\x43\xd8\xf9\x66\x19\x31\xca\x1f\x82\xc3\xe0\x67\x1a\x58\xf8\x8a\x2c\x41\x59\x47";
+
gnutls_datum_t _dsa_p = {dsa_p, sizeof(dsa_p)-1};
gnutls_datum_t _dsa_q = {dsa_q, sizeof(dsa_q)-1};
gnutls_datum_t _dsa_g = {dsa_g, sizeof(dsa_g)-1};
@@ -110,6 +114,10 @@ gnutls_datum_t _false_ed25519_x = {false_ed25519_x, sizeof(false_ed25519_x)-1};
gnutls_datum_t _ed25519_x = {ed25519_x, sizeof(ed25519_x)-1};
gnutls_datum_t _ed25519_k = {ed25519_k, sizeof(ed25519_k)-1};
+gnutls_datum_t _gost_x = {gost_x, sizeof(gost_x)-1};
+gnutls_datum_t _gost_y = {gost_y, sizeof(gost_y)-1};
+gnutls_datum_t _gost_k = {gost_k, sizeof(gost_k)-1};
+
unsigned char ecc_params[] = "\x06\x08\x2a\x86\x48\xce\x3d\x03\x01\x07";
unsigned char ecc_point[] = "\x04\x41\x04\x3c\x15\x6f\x1d\x48\x3e\x64\x59\x13\x2c\x6d\x04\x1a\x38\x0d\x30\x5c\xe4\x3f\x55\xcb\xd9\x17\x15\x46\x72\x71\x92\xc1\xf8\xc6\x33\x3d\x04\x2e\xc8\xc1\x0f\xc0\x50\x04\x7b\x9f\xc9\x48\xb5\x40\xfa\x6f\x93\x82\x59\x61\x5e\x72\x57\xcb\x83\x06\xbd\xcc\x82\x94\xc1";
@@ -262,6 +270,8 @@ int check_privkey_import_export(void)
gnutls_datum_t p, q, g, y, x;
gnutls_datum_t m, e, u, e1, e2, d;
gnutls_ecc_curve_t curve;
+ gnutls_digest_algorithm_t digest;
+ gnutls_gost_paramset_t paramset;
int ret;
global_init();
@@ -438,6 +448,62 @@ int check_privkey_import_export(void)
gnutls_privkey_deinit(key);
+ /* GOST */
+ ret = gnutls_privkey_init(&key);
+ if (ret < 0)
+ fail("error\n");
+
+ ret = gnutls_privkey_import_gost_raw(key, GNUTLS_ECC_CURVE_GOST256CPXA, GNUTLS_DIG_GOSTR_94, GNUTLS_GOST_PARAMSET_CP_A, &_gost_x, &_gost_y, &_gost_k);
+ if (ret < 0)
+ fail("error\n");
+
+ ret = gnutls_privkey_export_gost_raw2(key, &curve, &digest, &paramset, &x, &y, &p, 0);
+ if (ret < 0)
+ fail("error\n");
+
+ if (curve != GNUTLS_ECC_CURVE_GOST256CPXA) {
+ fprintf(stderr, "unexpected curve value: %d\n", (int)curve);
+ exit(1);
+ }
+ if (digest != GNUTLS_DIG_GOSTR_94) {
+ fprintf(stderr, "unexpected digest value: %d\n", (int)digest);
+ exit(1);
+ }
+ if (paramset != GNUTLS_GOST_PARAMSET_CP_A) {
+ fprintf(stderr, "unexpected paramset value: %d\n", (int)paramset);
+ exit(1);
+ }
+ CMP("x", &x, gost_x);
+ CMP("y", &y, gost_y);
+ CMP("k", &p, gost_k);
+ gnutls_free(x.data);
+ gnutls_free(y.data);
+ gnutls_free(p.data);
+
+ ret = gnutls_privkey_export_gost_raw2(key, &curve, &digest, &paramset, &x, &y, &p, GNUTLS_EXPORT_FLAG_NO_LZ);
+ if (ret < 0)
+ fail("error\n");
+
+ if (curve != GNUTLS_ECC_CURVE_GOST256CPXA) {
+ fprintf(stderr, "unexpected curve value: %d\n", (int)curve);
+ exit(1);
+ }
+ if (digest != GNUTLS_DIG_GOSTR_94) {
+ fprintf(stderr, "unexpected digest value: %d\n", (int)digest);
+ exit(1);
+ }
+ if (paramset != GNUTLS_GOST_PARAMSET_CP_A) {
+ fprintf(stderr, "unexpected paramset value: %d\n", (int)paramset);
+ exit(1);
+ }
+ CMP_NO_LZ("x", &x, gost_x);
+ CMP_NO_LZ("y", &y, gost_y);
+ CMP_NO_LZ("k", &p, gost_k);
+ gnutls_free(x.data);
+ gnutls_free(y.data);
+ gnutls_free(p.data);
+ gnutls_privkey_deinit(key);
+
return 0;
}
@@ -769,6 +835,108 @@ int check_ed25519(void)
return 0;
}
+static
+int check_gost(void)
+{
+ gnutls_privkey_t key;
+ gnutls_pubkey_t pub;
+ gnutls_datum_t y, x, k;
+ gnutls_ecc_curve_t curve;
+ gnutls_digest_algorithm_t digest;
+ gnutls_gost_paramset_t paramset;
+ int ret;
+
+ /* ECC */
+ ret = gnutls_privkey_init(&key);
+ if (ret < 0)
+ fail("error\n");
+
+ ret = gnutls_pubkey_init(&pub);
+ if (ret < 0)
+ fail("error\n");
+
+ ret = gnutls_privkey_import_x509_raw(key, &server_ca3_gost01_key, GNUTLS_X509_FMT_PEM, 0, 0);
+ if (ret < 0)
+ fail("error\n");
+
+ ret = gnutls_pubkey_import_privkey(pub, key, 0, 0);
+ if (ret < 0)
+ fail("error\n");
+
+ ret = gnutls_pubkey_export_gost_raw2(pub, &curve, &digest, &paramset, &x, &y, 0);
+ if (ret < 0)
+ fail("error\n");
+
+ if (curve != GNUTLS_ECC_CURVE_GOST256CPXA) {
+ fprintf(stderr, "unexpected curve value: %d\n", (int)curve);
+ exit(1);
+ }
+ if (digest != GNUTLS_DIG_GOSTR_94) {
+ fprintf(stderr, "unexpected digest value: %d\n", (int)digest);
+ exit(1);
+ }
+ if (paramset != GNUTLS_GOST_PARAMSET_CP_A) {
+ fprintf(stderr, "unexpected paramset value: %d\n", (int)paramset);
+ exit(1);
+ }
+ CMP("x", &x, gost_x);
+ CMP("y", &y, gost_y);
+ gnutls_free(x.data);
+ gnutls_free(y.data);
+
+ ret = gnutls_pubkey_export_gost_raw2(pub, &curve, &digest, &paramset, &x, &y, GNUTLS_EXPORT_FLAG_NO_LZ);
+ if (ret < 0)
+ fail("error\n");
+
+ if (curve != GNUTLS_ECC_CURVE_GOST256CPXA) {
+ fprintf(stderr, "unexpected curve value: %d\n", (int)curve);
+ exit(1);
+ }
+ if (digest != GNUTLS_DIG_GOSTR_94) {
+ fprintf(stderr, "unexpected digest value: %d\n", (int)digest);
+ exit(1);
+ }
+ if (paramset != GNUTLS_GOST_PARAMSET_CP_A) {
+ fprintf(stderr, "unexpected paramset value: %d\n", (int)paramset);
+ exit(1);
+ }
+ CMP_NO_LZ("x", &x, gost_x);
+ CMP_NO_LZ("y", &y, gost_y);
+ gnutls_free(x.data);
+ gnutls_free(y.data);
+
+
+ /* check the private key export */
+ ret = gnutls_privkey_export_gost_raw2(key, &curve, &digest, &paramset, &x, &y, &k, 0);
+ if (ret < 0)
+ fail("error\n");
+
+ if (curve != GNUTLS_ECC_CURVE_GOST256CPXA) {
+ fprintf(stderr, "unexpected curve value: %d\n", (int)curve);
+ exit(1);
+ }
+ if (digest != GNUTLS_DIG_GOSTR_94) {
+ fprintf(stderr, "unexpected digest value: %d\n", (int)digest);
+ exit(1);
+ }
+ if (paramset != GNUTLS_GOST_PARAMSET_CP_A) {
+ fprintf(stderr, "unexpected paramset value: %d\n", (int)paramset);
+ exit(1);
+ }
+ CMP("x", &x, gost_x);
+ CMP("y", &y, gost_y);
+ CMP("k", &k, gost_k);
+ gnutls_free(x.data);
+ gnutls_free(y.data);
+ gnutls_free(k.data);
+
+ gnutls_privkey_deinit(key);
+
+ gnutls_pubkey_deinit(pub);
+
+ return 0;
+}
+
void doit(void)
{
if (check_x509_privkey() != 0) {
@@ -798,4 +966,8 @@ void doit(void)
if (check_ed25519() != 0) {
fail("error in ed25519 check\n");
}
+
+ if (check_gost() != 0) {
+ fail("error in gost check\n");
+ }
}
diff --git a/tests/oids.c b/tests/oids.c
index 0ec0dde190..ed65b057a2 100644
--- a/tests/oids.c
+++ b/tests/oids.c
@@ -70,12 +70,28 @@ void doit(void)
SELF_TEST_SIG(GNUTLS_SIGN_EDDSA_ED25519);
+ if (!gnutls_fips140_mode_enabled()) {
+#ifdef ENABLE_GOST
+ SELF_TEST_SIG(GNUTLS_SIGN_GOST_94);
+ SELF_TEST_SIG(GNUTLS_SIGN_GOST_256);
+ SELF_TEST_SIG(GNUTLS_SIGN_GOST_512);
+#endif
+ }
+
SELF_TEST_PK(GNUTLS_PK_RSA);
SELF_TEST_PK(GNUTLS_PK_DSA);
SELF_TEST_PK(GNUTLS_PK_EC);
SELF_TEST_PK(GNUTLS_PK_RSA_PSS);
SELF_TEST_PK(GNUTLS_PK_EDDSA_ED25519);
+ if (!gnutls_fips140_mode_enabled()) {
+#ifdef ENABLE_GOST
+ SELF_TEST_PK(GNUTLS_PK_GOST_01);
+ SELF_TEST_PK(GNUTLS_PK_GOST_12_256);
+ SELF_TEST_PK(GNUTLS_PK_GOST_12_512);
+#endif
+ }
+
SELF_TEST_DIG(GNUTLS_DIG_MD5);
SELF_TEST_DIG(GNUTLS_DIG_SHA1);
SELF_TEST_DIG(GNUTLS_DIG_SHA256);
@@ -84,4 +100,12 @@ void doit(void)
SELF_TEST_DIG(GNUTLS_DIG_SHA3_256);
SELF_TEST_DIG(GNUTLS_DIG_SHA3_384);
SELF_TEST_DIG(GNUTLS_DIG_SHA3_512);
+
+ if (!gnutls_fips140_mode_enabled()) {
+#ifdef ENABLE_GOST
+ SELF_TEST_DIG(GNUTLS_DIG_GOSTR_94);
+ SELF_TEST_DIG(GNUTLS_DIG_STREEBOG_256);
+ SELF_TEST_DIG(GNUTLS_DIG_STREEBOG_512);
+#endif
+ }
}
diff --git a/tests/pkcs11/pkcs11-chainverify.c b/tests/pkcs11/pkcs11-chainverify.c
index fda1e2de08..e9865b62b9 100644
--- a/tests/pkcs11/pkcs11-chainverify.c
+++ b/tests/pkcs11/pkcs11-chainverify.c
@@ -129,6 +129,12 @@ void doit(void)
printf("Chain '%s' (%d)...\n", chains[i].name,
(int) i);
+ if (chains[i].notfips && gnutls_fips140_mode_enabled()) {
+ if (debug)
+ printf("Skipping in FIPS mode...\n");
+ continue;
+ }
+
for (j = 0; chains[i].chain[j]; j++) {
if (debug > 2)
printf("\tAdding certificate %d...",
diff --git a/tests/privkey-keygen.c b/tests/privkey-keygen.c
index 885cf58e57..85f803a6b3 100644
--- a/tests/privkey-keygen.c
+++ b/tests/privkey-keygen.c
@@ -67,6 +67,12 @@ static void sign_verify_data(gnutls_pk_algorithm_t algorithm, gnutls_x509_privke
if (algorithm == GNUTLS_PK_EDDSA_ED25519)
digest = GNUTLS_DIG_SHA512;
+ else if (algorithm == GNUTLS_PK_GOST_01)
+ digest = GNUTLS_DIG_GOSTR_94;
+ else if (algorithm == GNUTLS_PK_GOST_12_256)
+ digest = GNUTLS_DIG_STREEBOG_256;
+ else if (algorithm == GNUTLS_PK_GOST_12_512)
+ digest = GNUTLS_DIG_STREEBOG_512;
else
digest = GNUTLS_DIG_SHA256;
@@ -119,6 +125,13 @@ void doit(void)
algorithm == GNUTLS_PK_ECDH_X25519)
continue;
+ if (gnutls_fips140_mode_enabled() &&
+ (algorithm == GNUTLS_PK_GOST_01 ||
+ algorithm == GNUTLS_PK_GOST_12_256 ||
+ algorithm == GNUTLS_PK_GOST_12_512))
+ continue;
+
+
ret = gnutls_x509_privkey_init(&pkey);
if (ret < 0) {
fail("gnutls_x509_privkey_init: %d\n",
diff --git a/tests/test-chains.h b/tests/test-chains.h
index 934d743c0d..93768fd90c 100644
--- a/tests/test-chains.h
+++ b/tests/test-chains.h
@@ -3773,6 +3773,76 @@ static const char *tls_feat_superset[] = {
NULL
};
+#ifdef ENABLE_GOST
+static const char *gost01[] = {
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIIBfTCCASqgAwIBAgICASIwCgYGKoUDAgIDBQAwNzELMAkGA1UEBhMCUlUxKDAm\n"
+ "BgNVBAMMH0NBIGNlcnRpZmljYXRlIChQS0NTMTIgZXhhbXBsZSkwHhcNMTIwNjE0\n"
+ "MTkzMDE5WhcNMTcwNjE0MTkzMDE5WjA5MQswCQYDVQQGEwJSVTEqMCgGA1UEAwwh\n"
+ "VGVzdCBjZXJ0aWZpY2F0ZSAoUEtDUzEyIGV4YW1wbGUpMGMwHAYGKoUDAgITMBIG\n"
+ "ByqFAwICIwEGByqFAwICHgEDQwAEQHlSMCMAJZgoHUCIFmn+eqOgYlQy8h7SfjZ2\n"
+ "kMkJ4xTae8jtZYxHLq3P+qJeismsHdmqdqSBbOGGdOaJNNPbAZKjGjAYMAkGA1Ud\n"
+ "EwQCMAAwCwYDVR0PBAQDAgWgMAoGBiqFAwICAwUAA0EArslfUeqhW9eFkspn89+C\n"
+ "OQEJX6JoghiOjFYlky0XmaaDl3D6EcbID+B6cBEmcXF21xxIEeYJIAqGzOEnMXdT\n"
+ "cg==\n"
+ "-----END CERTIFICATE-----\n",
+ NULL,
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIIBfTCCASqgAwIBAgIBADAKBgYqhQMCAgMFADA3MQswCQYDVQQGEwJSVTEoMCYG\n"
+ "A1UEAwwfQ0EgY2VydGlmaWNhdGUgKFBLQ1MxMiBleGFtcGxlKTAeFw0xMjA2MTQx\n"
+ "MzEyMzFaFw0xNzA2MTQxMzEyMzFaMDcxCzAJBgNVBAYTAlJVMSgwJgYDVQQDDB9D\n"
+ "QSBjZXJ0aWZpY2F0ZSAoUEtDUzEyIGV4YW1wbGUpMGMwHAYGKoUDAgITMBIGByqF\n"
+ "AwICIwEGByqFAwICHgEDQwAEQHxF7QOkGNDlnKWiBwdD80gToowegPcHR1Y1r2ZR\n"
+ "RQqB610f3uEWN/EikI7exYVRR0dmCyILLMmgRxX+KU4qmgejHTAbMAwGA1UdEwQF\n"
+ "MAMBAf8wCwYDVR0PBAQDAgEGMAoGBiqFAwICAwUAA0EAFnvKPRo2tQkI/iqu/CkP\n"
+ "YQJPW43KnRMqkmB/NnGOC5+wdivIA5yJaGbT2sQ1r+n6qyJnG32yV44DrSe7b2DV\n"
+ "OA==\n"
+ "-----END CERTIFICATE-----\n",
+ NULL
+};
+
+static const char *gost12_256[] = {
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIICYjCCAg+gAwIBAgIBATAKBggqhQMHAQEDAjBWMSkwJwYJKoZIhvcNAQkBFhpH\n"
+ "b3N0UjM0MTAtMjAxMkBleGFtcGxlLmNvbTEpMCcGA1UEAxMgR29zdFIzNDEwLTIw\n"
+ "MTIgKDI1NiBiaXQpIGV4YW1wbGUwHhcNMTMxMTA1MTQwMjM3WhcNMzAxMTAxMTQw\n"
+ "MjM3WjBWMSkwJwYJKoZIhvcNAQkBFhpHb3N0UjM0MTAtMjAxMkBleGFtcGxlLmNv\n"
+ "bTEpMCcGA1UEAxMgR29zdFIzNDEwLTIwMTIgKDI1NiBiaXQpIGV4YW1wbGUwZjAf\n"
+ "BggqhQMHAQEBATATBgcqhQMCAiQABggqhQMHAQECAgNDAARAut/Qw1MUq9KPqkdH\n"
+ "C2xAF3K7TugHfo9n525D2s5mFZdD5pwf90/i4vF0mFmr9nfRwMYP4o0Pg1mOn5Rl\n"
+ "aXNYraOBwDCBvTAdBgNVHQ4EFgQU1fIeN1HaPbw+XWUzbkJ+kHJUT0AwCwYDVR0P\n"
+ "BAQDAgHGMA8GA1UdEwQIMAYBAf8CAQEwfgYDVR0BBHcwdYAU1fIeN1HaPbw+XWUz\n"
+ "bkJ+kHJUT0ChWqRYMFYxKTAnBgkqhkiG9w0BCQEWGkdvc3RSMzQxMC0yMDEyQGV4\n"
+ "YW1wbGUuY29tMSkwJwYDVQQDEyBHb3N0UjM0MTAtMjAxMiAoMjU2IGJpdCkgZXhh\n"
+ "bXBsZYIBATAKBggqhQMHAQEDAgNBAF5bm4BbARR6hJLEoWJkOsYV3Hd7kXQQjz3C\n"
+ "dqQfmHrz6TI6Xojdh/t8ckODv/587NS5/6KsM77vc6Wh90NAT2s=\n"
+ "-----END CERTIFICATE-----\n",
+ NULL
+};
+
+static const char *gost12_512[] = {
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIIC6DCCAlSgAwIBAgIBATAKBggqhQMHAQEDAzBWMSkwJwYJKoZIhvcNAQkBFhpH\n"
+ "b3N0UjM0MTAtMjAxMkBleGFtcGxlLmNvbTEpMCcGA1UEAxMgR29zdFIzNDEwLTIw\n"
+ "MTIgKDUxMiBiaXQpIGV4YW1wbGUwHhcNMTMxMDA0MDczNjA0WhcNMzAxMDAxMDcz\n"
+ "NjA0WjBWMSkwJwYJKoZIhvcNAQkBFhpHb3N0UjM0MTAtMjAxMkBleGFtcGxlLmNv\n"
+ "bTEpMCcGA1UEAxMgR29zdFIzNDEwLTIwMTIgKDUxMiBiaXQpIGV4YW1wbGUwgaow\n"
+ "IQYIKoUDBwEBAQIwFQYJKoUDBwECAQICBggqhQMHAQECAwOBhAAEgYATGQ9VCiM5\n"
+ "FRGCQ8MEz2F1dANqhaEuywa8CbxOnTvaGJpFQVXQwkwvLFAKh7hk542vOEtxpKtT\n"
+ "CXfGf84nRhMH/Q9bZeAc2eO/yhxrsQhTBufa1Fuou2oe/jUOaG6RAtUUvRzhNTpp\n"
+ "RGGl1+EIY2vzzUua9j9Ol/gAoy/LNKQIfqOBwDCBvTAdBgNVHQ4EFgQUPcbTRXJZ\n"
+ "nHtjj+eBP7b5lcTMekIwCwYDVR0PBAQDAgHGMA8GA1UdEwQIMAYBAf8CAQEwfgYD\n"
+ "VR0BBHcwdYAUPcbTRXJZnHtjj+eBP7b5lcTMekKhWqRYMFYxKTAnBgkqhkiG9w0B\n"
+ "CQEWGkdvc3RSMzQxMC0yMDEyQGV4YW1wbGUuY29tMSkwJwYDVQQDEyBHb3N0UjM0\n"
+ "MTAtMjAxMiAoNTEyIGJpdCkgZXhhbXBsZYIBATAKBggqhQMHAQEDAwOBgQBObS7o\n"
+ "ppPTXzHyVR1DtPa8b57nudJzI4czhsfeX5HDntOq45t9B/qSs8dC6eGxbhHZ9zCO\n"
+ "SFtxWYdmg0au8XI9Xb8vTC1qdwWID7FFjMWDNQZb6lYh/J+8F2xKylvB5nIlRZqO\n"
+ "o3eUNFkNyHJwQCk2WoOlO16zwGk2tdKH4KmD5w==\n"
+ "-----END CERTIFICATE-----\n",
+ NULL
+};
+#endif
+
#if defined __clang__ || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wunused-variable"
@@ -3787,6 +3857,7 @@ static struct
unsigned int expected_verify_result;
const char *purpose;
time_t expected_time;
+ unsigned notfips;
} chains[] =
{
{ "CVE-2014-0092", cve_2014_0092_check, &cve_2014_0092_check[1],
@@ -3928,6 +3999,13 @@ static struct
{ "rsa pss: chain with increasing salt size - ok", rsa_pss_chain_increasing_salt_size_ok, &rsa_pss_chain_increasing_salt_size_ok[3], 0, 0, 0, 1501159136},
{ "rsa pss: chain with alternating signatures - ok", rsa_pss_chain_pkcs11_pss_pkcs1_ok, &rsa_pss_chain_pkcs11_pss_pkcs1_ok[3], 0, 0, 0, 1501159136},
{ "rsa pss: chain with changing hashes - ok", rsa_pss_chain_sha512_sha384_sha256_ok, &rsa_pss_chain_sha512_sha384_sha256_ok[3], 0, 0, 0, 1501159136},
+#ifdef ENABLE_GOST
+ { "gost 34.10-01 - ok", gost01, &gost01[2], 0, 0, 0, 1466612070, 1},
+ { "gost 34.10-01 - not ok (due to profile)", gost01, &gost01[2], GNUTLS_PROFILE_TO_VFLAGS(GNUTLS_PROFILE_ULTRA),
+ GNUTLS_CERT_INSECURE_ALGORITHM | GNUTLS_CERT_INVALID, NULL, 1466612070, 1},
+ { "gost 34.10-12-256 - ok", gost12_256, &gost12_256[0], 0, 0, 0, 1466612070, 1},
+ { "gost 34.10-12-512 - ok", gost12_512, &gost12_512[0], 0, 0, 0, 1466612070, 1},
+#endif
{ NULL, NULL, NULL, 0, 0}
};
diff --git a/tests/x509sign-verify-common.h b/tests/x509sign-verify-common.h
index 9f87229403..d7f3b41cfa 100644
--- a/tests/x509sign-verify-common.h
+++ b/tests/x509sign-verify-common.h
@@ -21,6 +21,39 @@ const gnutls_datum_t sha256_data = {
32
};
+/* gost r 34.11-94 hash of "hello" string */
+const gnutls_datum_t gostr94_data = {
+ (void *)
+ "\x92\xea\x6d\xdb\xaf\x40\x02\x0d\xf3\x65"
+ "\x1f\x27\x8f\xd7\x15\x12\x17\xa2\x4a\xa8"
+ "\xd2\x2e\xbd\x25\x19\xcf\xd4\xd8\x9e\x64"
+ "\x50\xea",
+ 32
+};
+
+/* Streebog-256 hash of "hello" string */
+const gnutls_datum_t streebog256_data = {
+ (void *)
+ "\x3f\xb0\x70\x0a\x41\xce\x6e\x41\x41\x3b"
+ "\xa7\x64\xf9\x8b\xf2\x13\x5b\xa6\xde\xd5"
+ "\x16\xbe\xa2\xfa\xe8\x42\x9c\xc5\xbd\xd4"
+ "\x6d\x6d",
+ 32
+};
+
+/* Streebog-512 hash of "hello" string */
+const gnutls_datum_t streebog512_data = {
+ (void *)
+ "\x8d\xf4\x14\x26\x09\x66\xbe\xb7\xb3\x4d"
+ "\x92\x07\x63\x07\x9e\x15\xdf\x1f\x63\x29"
+ "\x7e\xb3\xdd\x43\x11\xe8\xb5\x85\xd4\xbf"
+ "\x2f\x59\x23\x21\x4f\x1d\xfe\xd3\xfd\xee"
+ "\x4a\xaf\x01\x83\x30\xa1\x2a\xcd\xe0\xef"
+ "\xcc\x33\x8e\xb5\x29\x22\xf3\xe5\x71\x21"
+ "\x2d\x42\xc8\xde",
+ 64
+};
+
const gnutls_datum_t invalid_hash_data = {
(void *)
"\xaa\xf4\xc6\x1d\xdc\xca\xe8\xa2\xda\xbe"
@@ -78,6 +111,12 @@ void test_sig(gnutls_pk_algorithm_t pk, unsigned hash, unsigned bits)
vflags |= GNUTLS_VERIFY_ALLOW_SIGN_WITH_SHA1;
} else if (hash == GNUTLS_DIG_SHA256)
hash_data = &sha256_data;
+ else if (hash == GNUTLS_DIG_GOSTR_94)
+ hash_data = &gostr94_data;
+ else if (hash == GNUTLS_DIG_STREEBOG_256)
+ hash_data = &streebog256_data;
+ else if (hash == GNUTLS_DIG_STREEBOG_512)
+ hash_data = &streebog512_data;
else
abort();
diff --git a/tests/x509sign-verify-gost.c b/tests/x509sign-verify-gost.c
new file mode 100644
index 0000000000..9a5c2eca7e
--- /dev/null
+++ b/tests/x509sign-verify-gost.c
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2016-2017 Free Software Foundation, Inc.
+ *
+ * Author: Dmitry Eremin-Solenikov
+ *
+ * This file is part of GnuTLS.
+ *
+ * The GnuTLS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+/* Parts copied from GnuTLS example programs. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifndef _WIN32
+# include <sys/types.h>
+# include <netinet/in.h>
+# include <sys/socket.h>
+# include <arpa/inet.h>
+# include <unistd.h>
+#endif
+#include <gnutls/gnutls.h>
+#include <gnutls/x509.h>
+#include <gnutls/abstract.h>
+
+#include "utils.h"
+
+#include "x509sign-verify-common.h"
+
+void doit(void)
+{
+#ifndef ENABLE_GOST
+ exit(77);
+#else
+ global_init();
+ gnutls_global_set_log_function(tls_log_func);
+ if (debug)
+ gnutls_global_set_log_level(6);
+
+ test_sig(GNUTLS_PK_GOST_01, GNUTLS_DIG_GOSTR_94, GNUTLS_CURVE_TO_BITS(GNUTLS_ECC_CURVE_GOST256CPA));
+ test_sig(GNUTLS_PK_GOST_12_256, GNUTLS_DIG_STREEBOG_256, GNUTLS_CURVE_TO_BITS(GNUTLS_ECC_CURVE_GOST256CPA));
+ test_sig(GNUTLS_PK_GOST_01, GNUTLS_DIG_GOSTR_94, GNUTLS_CURVE_TO_BITS(GNUTLS_ECC_CURVE_GOST256CPXA));
+ test_sig(GNUTLS_PK_GOST_12_256, GNUTLS_DIG_STREEBOG_256, GNUTLS_CURVE_TO_BITS(GNUTLS_ECC_CURVE_GOST256CPXA));
+ test_sig(GNUTLS_PK_GOST_12_512, GNUTLS_DIG_STREEBOG_512, GNUTLS_CURVE_TO_BITS(GNUTLS_ECC_CURVE_GOST512A));
+
+ gnutls_global_deinit();
+#endif
+}